C++ c++;-类类型的构造函数返回左值?

C++ c++;-类类型的构造函数返回左值?,c++,lvalue,rvalue,C++,Lvalue,Rvalue,为什么第一行不编译而第二行编译 float& t = float(10); // initial value of reference to non - const must be an lvalue string& w = string("gg"); 这是否意味着字符串构造函数返回左值?定义的构造函数没有返回值。您试图执行的是引用不允许的临时值 理解左值和右值参考文献的好文章是。你得到的不是你期望的: float& ref = float(10); 这里发生了什么浮

为什么第一行不编译而第二行编译

float& t = float(10); // initial value of reference to non - const must be an lvalue
string& w = string("gg");

这是否意味着字符串构造函数返回左值?

定义的构造函数没有返回值。您试图执行的是引用不允许的临时值


理解
左值
右值
参考文献的好文章是。

你得到的不是你期望的:

float& ref = float(10);
这里发生了什么<代码>浮点(10)创建一个临时浮点(不绑定任何内容),因此它是一个右值。因此,不能将其绑定到非常量左值引用

float const & cref = float(10); // OK!
这与
std::string
的机制相同。我感到困惑的是,在字符串示例中没有出现编译器错误(我使用gcc 5.3.0)


请注意,这与所谓的“构造函数返回值”无关,因为构造函数没有这样的内容。

g++4.8.2为每一行提供了一个“错误:类型为…”的非常量引用初始化无效。这是一个好问题,这让我想知道为什么这里总是有人在投票/接近投票的问题(甚至没有留下解释原因的评论)。这里的一些用户应该被合理地剥夺这种特权。我猜第二行编译是因为您使用的是MSVC,而不是使用/W4编译。如果使用/W4编译,您应该会看到类似“警告C4239:使用了非标准扩展”。@barakmanos问题似乎有一个错误的假设,即第二行是正确的。正如答案所示,这个问题目前被提出,它完全是无效的。它不太可能对未来的读者有用,这就是为什么(我猜)有人选择了接近的理由[…]虽然这里可能有类似的问题,但这一问题的解决方式不太可能对未来的读者有所帮助。[…]。@JonasWielicki:IMO,“正如答案所示,它完全无效”是一个矛盾修饰法。如果存在一个有效的答案,那么根据定义,这个问题是有效的。“你试图执行的是引用一个临时值,这是不允许的。”是的,我同意这个说法。我只是不明白为什么第二行要编译。这是正确的。我正在使用MSVC。也许MSVC有一些特殊的属性?这很奇怪,因为我在gcc和clang两种情况下都遇到了相同的错误:
无法从右值初始化非常量引用。谢谢你的回答。我想这是因为我使用的是MSVC。