非等级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&&)