左值初始化失败

Zha*_*iao 6 c++ string gcc c++11

"C++编程语言第4版"中的一些示例代码让我感到困惑.这是我的测试用例.

Env gcc版本4.6.3(Debian 4.6.3-14 + rpi1),其中-std = c ++ 0x

  • Code1 string var {"Cambridge"}; string& r1 {var}; 编译失败
  • Code2 string var {"Cambridge"}; string& r1 = var; 编译成功
  • Code3 string var {"Cambridge"}; string&& r1 {var}; 编译成功
  • Code1编译失败 g++ -g -DLINUX -std=c++0x -c src/dummy.cpp -o src/dummy.o src/dummy.cpp: In function ‘int main(int, char**)’: src/dummy.cpp:26:17: error: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘<brace-enclosed initializer list>’ make: *** [src/dummy.o] Error 1
  • 根据书籍,Code1应该没问题.第7.7.2节因为var是左值,但为什么code1不起作用,但code3在我的情况下工作?

chi*_*ill 3

它失败是因为它尝试将右值绑定到非常量左值引用。

\n\n
\n

8.5.4 列表初始化

\n\n

[#3]

\n\n

-- 否则,如果 T 是引用类型,则T 引用的类型的纯右值临时值将被列表初始化,并且引用将绑定到该临时值。[ 注意:像往常一样,如果引用类型是对非常量类型的左值引用,则绑定将失败\n并且程序格式错误。\xe2\x80\x94 尾注]

\n
\n\n

检查此示例以验证r1绑定到不同的对象

\n\n
#include <string>\n#include <iostream>\n\nint\nmain () {\n  std::string var {"Cambridge"};\n  const std::string& r1 {var}; \n  const std::string& r2 (var);\n\n  var.clear ();\n\n  std::cout << "var = " << var << std::endl;\n  std::cout << "r1 = " << r1 << std::endl;\n  std::cout << "r2 = " << r2 << std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并将其与 进行对比r2

\n\n

附言。现在问题来了,根据上面的考虑,为什么下面的方法不会失败:

\n\n
int x;\nint &y { x };\n
Run Code Online (Sandbox Code Playgroud)\n\n

标准说(与上面相同的地方,但下一个条款):

\n\n
\n

-- 否则,如果初始化列表只有一个元素,则从该元素初始化对象或引用;

\n
\n\n

该子句明确提到了引用,换句话说,初始化引用不是在单个子句中描述的,但有一些可能性(也许按子句的顺序尝试?),这解释了为什么会int &这样。

\n