当前位置: 首页 > 知识库问答 >
问题:

C 11不使用左值初始化右值引用的标准参考?

仇正豪
2023-03-14

考虑以下C 11代码:

int& f();

int&& i = f();

这会产生一个错误:

cannot bind ‘int’ lvalue to ‘int&&’

我明白为什么,但我正试图从标准中的语言来证明这一点。

意译C 11 N34858.5.3.5:

int的引用由int类型的表达式初始化,如下所示:(yes)

如果引用是右值引用:(是)

如果初始值设定项表达式:(是)

  1. 是xvalue、类prvalue、数组prvalue还是函数左值(否?),或

这两点都不适用吗?所以我们应该假设它是不正确的,因为两者都不是?

如何从标准中确定不能使用int类型的左值初始化对int的右值引用?

共有1个答案

轩辕翰
2023-03-14

我想你错过了那篇文章的最后一个要点(8.5.3p5),那就是:

如果T1是与T2相关的引用,且引用是右值引用,则初始值设定项表达式不应为左值。

 类似资料:
  • 我试图用初始值设定项列表初始化类成员const std::array引用: 但显然 无法初始化引用类型“const std::array” Q: 有没有办法用右值初始化const std::array引用成员?

  • 这两个函数完全匹配。以下是该标准的引用: 标准转换序列S1是比标准转换序列S2更好的转换序列,如果 ... S1和S2是引用绑定(8.5.3),都不引用未使用ref限定符声明的非静态成员函数的隐式对象参数,S1将右值引用绑定到右值,S2将左值引用绑定。 这不意味着第二个更好吗? 更新: 有一个相关的问题。下面的代码是它的简化版本。

  • 这个电话含糊不清吗?MSVC选择右值引用重载。GCC表示这是不明确的。Clang也选择右值引用,但如果它是

  • 左值(赋值操作符“=”的左侧,通常是一个变量)与右值(赋值操作符“=”的右侧,通常是一个常数、表达式、函数调用)之间的差别可以追溯到 Christopher Strachey (C++的祖先语言CPL之父,指称语义学之父)时代。在C++中,左值可被绑定到非const引用,左值或者右值则可被绑定到const引用。但是却没有什么可以绑定到非const的右值(译注:即右值无法被非const的引用绑定),

  • 问题内容: 如果未将显式值传递给方法,我想用一些默认值初始化方法的参数-像这样: 我得到了错误: 我该如何解决? 问题答案: 这里常见的习惯用法是将默认值设置为一些哨兵值用于此目的,这是典型值,然后您可以检查该值。 您可能还会看到用于哨兵的实例。 后一个版本的优点是可以传递给函数,但有一些缺点(请参见下面@larsmans的评论)。如果您不认为需要将有意义的参数传递给您的方法,那么我建议您使用它。