等级rvalues总是有cv
§3.10第9节规定“非等级rvalues总是具有cv不合格类型”。 这让我想知道...
int foo()
{
return 5;
}
const int bar()
{
return 5;
}
void pass_int(int&& i)
{
std::cout << "rvaluen";
}
void pass_int(const int&& i)
{
std::cout << "const rvaluen";
}
int main()
{
pass_int(foo()); // prints "rvalue"
pass_int(bar()); // prints "const rvalue"
}
根据标准,对于非类类型,不存在常量右值,但bar()
更喜欢绑定到const int&&
。 这是一个编译器错误?
编辑:显然, this
也是一个const rvalue :)
编辑:这个问题似乎是固定在g + + 4.5.0,两行现在打印“右值”。
委员会似乎已经意识到这部分标准存在问题。 CWG第690期问题与标准完全相同(在2009年9月的“附加说明”中)有些类似的问题。 我想很快就会为这部分标准起草新的语言。
编辑:我刚刚在comp.std.c ++上提交了一篇文章,注意到这个问题,并为该标准的相关部分提出了新的措辞。 不幸的是,作为一个主持人的新闻组,几乎每个人都可能在通过核准队列时忘记了这个问题。
好点子。 我想有两件事要看:1)当你指出非类的右值时,2)重载解析如何工作:
最佳函数的选择标准是参数的数量,参数与候选函数的参数类型列表匹配的程度,
我没有看到标准中的任何内容,告诉我在重载解决过程中会专门处理非类型右值。
你的问题已经在我的标准草案(N-4411)中有所涉及:
然而,起作用的是一般的参考绑定,隐式转换序列,引用和重载解析的并行读取:
13.3.3.1.4参考绑定
2当参考类型的参数不直接绑定到参数表达式时,转换序列是根据13.3.3.1将参数表达式转换为参考的基础类型所需的参数。
和
13.3.3.2排列隐式转换序列
3除非以下规则之一适用,否则相同形式的两个隐式转换序列是不可区分的转换序列:
- 标准转换顺序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&&)
链接地址: http://www.djcxy.com/p/40283.html
上一篇: class rvalues always have cv
下一篇: Are literal strings and function return values lvalues or rvalues?