C++ Foo&Foo=Bar()是合法的还是编译器的问题

C++ Foo&Foo=Bar()是合法的还是编译器的问题,c++,visual-c++,reference,visual-c++-2010,C++,Visual C++,Reference,Visual C++ 2010,因为它写在对这个问题的回答和评论中,我不能给引用赋值。但是,我可以编译这段代码MSVC++2010而不出现错误或警告。这是我的编译器的已知问题吗?临时变量不绑定到非常量引用。这就是语言的设计方式 虽然原则上不存在允许非恒定访问临时文件的技术障碍,但这几乎总是糟糕的设计,而且常常在逻辑上是错误的,因此标准不允许这样做。如果您觉得有必要修改临时变量,您应该重新考虑为什么要这样做。临时变量不绑定到非常量引用。这就是语言的设计方式 虽然原则上不存在允许非恒定访问临时文件的技术障碍,但这几乎总是糟糕的设计

因为它写在对这个问题的回答和评论中,我不能给引用赋值。但是,我可以编译这段代码MSVC++2010而不出现错误或警告。这是我的编译器的已知问题吗?

临时变量不绑定到非常量引用。这就是语言的设计方式


虽然原则上不存在允许非恒定访问临时文件的技术障碍,但这几乎总是糟糕的设计,而且常常在逻辑上是错误的,因此标准不允许这样做。如果您觉得有必要修改临时变量,您应该重新考虑为什么要这样做。

临时变量不绑定到非常量引用。这就是语言的设计方式


虽然原则上不存在允许非恒定访问临时文件的技术障碍,但这几乎总是糟糕的设计,而且常常在逻辑上是错误的,因此标准不允许这样做。如果您觉得有必要修改临时值,您应该重新考虑为什么要这样做。

您正在为引用指定一个临时值。这是暂时的,因为在这里,Bar就像一个函数,返回一个Bar实例,该实例将在表达式作用域的和处消失,这是行的结尾。这是非常危险和非法的,因为取消对foo的引用会产生未定义的行为。我不知道为什么MSVC++允许这个特性,这一定是一个错误

警告级别为4/W4时,您将获得

struct Foo {};
struct Bar : Foo {};

Foo &foo = Bar(); // without const
您应该始终编写警告级别为4的代码。
最后,@KerrekSB的答案比我的好,你应该选择他的作为答案。

你在给引用赋值。这是暂时的,因为在这里,Bar就像一个函数,返回一个Bar实例,该实例将在表达式作用域的和处消失,这是行的结尾。这是非常危险和非法的,因为取消对foo的引用会产生未定义的行为。我不知道为什么MSVC++允许这个特性,这一定是一个错误

警告级别为4/W4时,您将获得

struct Foo {};
struct Bar : Foo {};

Foo &foo = Bar(); // without const
您应该始终编写警告级别为4的代码。

最后,@KerrekSB的答案比我的好,你应该选择他的作为答案。

你可以将一个临时引用绑定到一个非常量引用这一事实是MSVC的一个已知特征。Bar之后的妄想症的目的是什么?“不应该只是酒吧吗?”MartinKristiansen不,为什么会这样?那会怎么样?如果MSVC没有抱怨,那就意味着你没有把警告级别调高。如果设置正确,则会在将r值绑定到非常量引用时警告使用非标准扩展。MSVC的一个已知功能是,可以将临时值绑定到非常量引用这一事实可能存在重复。Bar后的PARANTESSES的用途是什么?“不应该只是酒吧吗?”MartinKristiansen不,为什么会这样?那会怎么样?如果MSVC没有抱怨,那就意味着你没有把警告级别调高。如果设置正确,则会在将r值绑定到非常量引用时警告使用非标准扩展。如果可能重复,答案是什么?可以作为扩展绑定到MSVC中的非常量引用吗?如果是,如何禁用该警告?@KerrekSB因为它是4级警告/W4,所以对于使用向导创建的项目,默认情况下禁用该警告;默认设置为/W3。我认为这应该是一个较低级别的警告,因为它可能导致不可移植的代码。@KerrekSB,答案是这种行为是MSVC编译器的非标准扩展。Praetorian是对的:首先,我使用/W3 optionSo编译,答案是什么?可以作为扩展绑定到MSVC中的非常量引用吗?如果是,如何禁用该警告?@KerrekSB因为它是4级警告/W4,所以对于使用向导创建的项目,默认情况下禁用该警告;默认设置为/W3。我认为这应该是一个较低级别的警告,因为它可能导致不可移植的代码。@KerrekSB,答案是这种行为是MSVC编译器的非标准扩展。Praetorian是对的:首先,我用/W3选项编译了你的答案+1。这很有用。然而,答案并不能解释我的问题。@Loom:是的,我明白。我想我隐约知道MSVC允许将此作为扩展。。。好吧,很高兴知道:-请记住,这不是符合标准的,因此不便于携带,很可能是某个地方存在设计缺陷的迹象。谢谢你的回答+1。这很有用。然而,答案并不能解释我的问题。@Loom:是的,我明白。我想我隐约知道MSVC允许将此作为扩展。。。好吧,很好的确定:-请记住,这不是符合标准的,因此不可移植,很可能是某个地方的设计缺陷的迹象。