Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
左值初始化失败 《C++编程语言第四版》中的一些示例代码让我困惑不已。这是我的测试用例_C++_String_Gcc_C++11 - Fatal编程技术网

左值初始化失败 《C++编程语言第四版》中的一些示例代码让我困惑不已。这是我的测试用例

左值初始化失败 《C++编程语言第四版》中的一些示例代码让我困惑不已。这是我的测试用例,c++,string,gcc,c++11,C++,String,Gcc,C++11,Envgcc版本4.6.3(Debian 4.6.3-14+rpi1),带-std=c++0x Code1字符串变量{“剑桥”};字符串&r1{var}编译失败 Code2字符串变量{“剑桥”};字符串&r1=var编译成功 Code3字符串变量{“剑桥”};字符串&&r1{var}编译成功 Code1编译失败,原因是g++-g-DLINUX-std=c++0x-c src/dummy.cpp-o src/dummy.o src/dummy.cpp:在函数“int main(int,char*

Envgcc版本4.6.3(Debian 4.6.3-14+rpi1),带-std=c++0x

  • Code1
    字符串变量{“剑桥”};字符串&r1{var}编译失败
  • Code2
    字符串变量{“剑桥”};字符串&r1=var编译成功
  • Code3
    字符串变量{“剑桥”};字符串&&r1{var}编译成功
  • Code1编译失败,原因是
    g++-g-DLINUX-std=c++0x-c src/dummy.cpp-o src/dummy.o
    src/dummy.cpp:在函数“int main(int,char**)”中:
    src/dummy.cpp:26:17:错误:从类型为“”的右值初始化类型为“std::string&{aka std::basic_string&}”的非常量引用无效
    make:**[src/dummy.o]错误1
    
  • 根据书上的描述,代码1应该可以。第7.7.2节既然var是左值,为什么在我的情况下code1不起作用而code3起作用
它失败,因为它试图将右值绑定到非ST左值引用

8.5.4列表初始化

[3]

--否则,如果T是引用类型,则该类型的prvalue为临时值 由T引用的是初始化列表,引用是 绑定到该临时文件。[注意:与往常一样,绑定将失败 如果引用类型是对非常量类型的左值引用,则程序的格式是错误的。-结束注释]

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

#include <string>
#include <iostream>

int
main () {
  std::string var {"Cambridge"};
  const std::string& r1 {var}; 
  const std::string& r2 (var);

  var.clear ();

  std::cout << "var = " << var << std::endl;
  std::cout << "r1 = " << r1 << std::endl;
  std::cout << "r2 = " << r2 << std::endl;
}
本标准规定(与上述位置相同,但下一条款):

--否则,如果初始值设定项列表有单个元素,则从该元素初始化对象或引用


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

看起来像是GCC中的一个bug(包括4.8),Clang很好地接受了版本1。您遇到了。希望最近的编译器能够实现建议的解决方案,而不是标准化缺陷。感谢您的回复。那么这是否意味着这本书的代码是错误的?它试图说这是一个正确的演示代码
string&r1{var}//左值引用,将r1绑定到var(一个左值)
这本书的第7.7.2节你能给我一些关于编译器的信息吗?您在编译示例代码时是否遇到了相同的“编译错误”?这里使用的是GCC 4.8.1。是的,我认为这本书有误,还有另一本书
string&&rr2{var}应该可以用。我还没有得到它。如果在代码1中将“string”替换为“int”,则它可以工作。遵循这个逻辑,我们将得出一个结论:“var是LValint(int var { 1 }),var是rValk(Strasvar var {abcd)}。语言的规则对于不同的类型是不同的,例如,代码> int <代码>不是一个类类型。恐怕您需要检查C++标准,第85.4节〔3〕。,在这里复制有点太长,但是你可以在这里阅读下一个标准的草稿,它是一样的。但是,实际上,我必须检查
int&
。等等。。。
int x;
int &y { x };