一个 VS2010 错误?允许在没有警告的情况下绑定非常量引用到右值?

One VS2010 bug ? Allowing binding non-const reference to rvalue WITHOUT EVEN a warning?(一个 VS2010 错误?允许在没有警告的情况下绑定非常量引用到右值?)
本文介绍了一个 VS2010 错误?允许在没有警告的情况下绑定非常量引用到右值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

string foo() { return "hello"; }
int main() 
{
    //below should be illegal for binding a non-const (lvalue) reference to a rvalue
    string& tem  = foo();   

    //below should be the correct one as only const reference can be bind to rvalue(most important const)
    const string& constTem = foo();   
}

  1. GCC 是给出编译错误的好方法:从 类型的临时对象对 std::string& 类型的非常量引用无效初始化std::string
  2. VS2008 还不错,至少它给出了一个编译警告:警告 C4239:使用了非标准扩展:正在初始化":从 std::stringstd::string & 的转换 非常量引用只能绑定到左值
  3. 问题来了 - VS2010(SP1) 没有任何问题错误或警告,为什么??!!我知道 VS2010 中的 rvalue reference 可用于绑定 rvalue 但我没有使用 &&,而是在演示代码中,我只是使用非常量左值引用!
  1. GCC is the good one to give a compile error: invalid initialization of non-const reference of type std::string& from a temporary of type std::string
  2. VS2008 is not too bad as at least it gives a compile warning: warning C4239: nonstandard extension used : 'initializing' : conversion from std::string to std::string & A non-const reference may only be bound to an lvalue
  3. Here comes the problematic one - VS2010(SP1) comples fine WITHOUT any error or warning, WHY ??!! I know rvalue reference in VS2010 can be used to bind with rvalue but I am NOT using &&, instead in the demo code, I was just using non-const lvalue reference !

这里有人能帮我解释一下VS2010的行为吗?是bug吗!?谢谢

Can somone help me explain the behavior of VS2010 here? Is it a bug !? Thanks

推荐答案

这是 VS 编译器的已知问题/功能.他们一直允许这样做,并且似乎没有任何推动删除该扩展.

That is a known issue/feature of the VS compilers. They have always allowed that and there does not seem to be any push into removing that extension.

这篇关于一个 VS2010 错误?允许在没有警告的情况下绑定非常量引用到右值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)