非等级rvalues总是有cv不合格的types
§3.10第9节规定:“非阶级的价值总是有cv不合格的types”。 这让我想知道
int foo() { return 5; } const int bar() { return 5; } void pass_int(int&& i) { std::cout << "rvalue\n"; } void pass_int(const int&& i) { std::cout << "const rvalue\n"; } int main() { pass_int(foo()); // prints "rvalue" pass_int(bar()); // prints "const rvalue" }
根据标准,对于非typestypes来说,不存在常量右值,但bar()
更喜欢绑定到const int&&
。 这是一个编译器错误?
编辑:显然, this
也是一个const rvalue 🙂
编辑:这个问题似乎是修复在g + + 4.5.0,两行现在打印“右值”。
委员会似乎已经意识到这部分标准存在问题。 CWG第690期问题谈到了与标准完全相同的部分问题(在2009年9月的“附加说明”中)。 我想很快就会为这部分标准起草新的语言。
编辑:我刚刚在comp.std.c ++上提交了一个post,注意到这个问题,并build议标准的相关部分新的措辞。 不幸的是,作为一个主持人的新闻组,几乎每个人都可能会在通过审批队列的时候忘记这个问题。
好点子。 我想有两件事情要看:1)你指出了非类右值的东西,2)重载parsing是如何工作的:
最佳函数的select标准是参数的个数,参数与候选函数的参数types列表匹配的程度,
我没有看到标准中的任何内容,告诉我在重载解决scheme中非特定的右值被特别对待。
你的问题已经在我的标准草案(N-4411)中有所涉及:
然而,起作用的是一般的参考绑定,隐式转换序列,引用和重载parsing的并行读取:
13.3.3.1.4参考绑定
2当引用types的参数不直接绑定到参数expression式时,转换序列是根据13.3.3.1将参数expression式转换为引用的基础types所需的转换序列。
和
13.3.3.2排列隐式转换序列
3除非下列规则之一适用,否则具有相同forms的两个隐式转换序列是不可区分的转换序列:
– 标准转换顺序S1是比标准更好的转换顺序
转换序列S2 if– S1和S2是引用绑定(8.5.3),既没有引用ref-qualifier也没有引用非静态成员函数的隐式对象参数,S1将左值引用绑定到左值,S2绑定右值引用或S1将右值引用绑定到右值,并且S2绑定左值引用。
[例如:
int i; int f(); int g(const int&); int g(const int&&); int j = g(i); // calls g(const int&) int k = g(f()); // calls g(const int&&)