Zha*_*iao 6 c++ string gcc c++11
"C++编程语言第4版"中的一些示例代码让我感到困惑.这是我的测试用例.
Env gcc版本4.6.3(Debian 4.6.3-14 + rpi1),其中-std = c ++ 0x
string var {"Cambridge"}; string& r1 {var}; 编译失败string var {"Cambridge"}; string& r1 = var; 编译成功string var {"Cambridge"}; string&& r1 {var}; 编译成功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
它失败是因为它尝试将右值绑定到非常量左值引用。
\n\n\n\n\n8.5.4 列表初始化
\n\n[#3]
\n\n-- 否则,如果 T 是引用类型,则T 引用的类型的纯右值临时值将被列表初始化,并且引用将绑定到该临时值。[ 注意:像往常一样,如果引用类型是对非常量类型的左值引用,则绑定将失败\n并且程序格式错误。\xe2\x80\x94 尾注]
\n
检查此示例以验证r1绑定到不同的对象
#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}\nRun Code Online (Sandbox Code Playgroud)\n\n并将其与 进行对比r2。
附言。现在问题来了,根据上面的考虑,为什么下面的方法不会失败:
\n\nint x;\nint &y { x };\nRun Code Online (Sandbox Code Playgroud)\n\n标准说(与上面相同的地方,但下一个条款):
\n\n\n\n\n-- 否则,如果初始化列表只有一个元素,则从该元素初始化对象或引用;
\n
该子句明确提到了引用,换句话说,初始化引用不是在单个子句中描述的,但有一些可能性(也许按子句的顺序尝试?),这解释了为什么会int &这样。
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |