左值初始化失败 《C++编程语言第四版》中的一些示例代码让我困惑不已。这是我的测试用例
Envgcc版本4.6.3(Debian 4.6.3-14+rpi1),带-std=c++0x左值初始化失败 《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*
- 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起作用李>
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 };