一个VS2010的bug?允许将非const引用绑定到rvalue而不发出警告?

Gob*_*0st 9 c++ reference visual-studio-2010 rvalue lvalue

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();   
}
Run Code Online (Sandbox Code Playgroud)
  1. GCC是一个很好的给出编译错误:std::string&从类型的临时类型无效初始化类型的非const引用std::string
  2. VS2008不算太差至少它给出了一个编译警告:警告C4239:初始化'::使用非标准扩展转换从std::stringstd::string &非const引用可以仅被绑定到一个左值
  3. 这有问题的一个 - VS2010(SP1)很好没有任何错误或警告,为什么?? !! 我知道VS2010中的rvalue引用可以用来绑定rvalue但是我没有使用&&,而是在演示代码中,我只是使用非const左值引用!

可以用somone帮我解释一下VS2010的行为吗?这是一个错误!?谢谢

Dav*_*eas 12

这是VS编译器的已知问题/特性.他们总是允许这样做,并且似乎没有任何推动去除该扩展.

  • @ Gob00st - MS有一些旧的代码是在规则修复之前编写的(他们的客户可能也是如此).他们认为支持旧代码比新标准更重要.也可以关闭扩展(因此无法编译某些Windows标头). (2认同)

Pup*_*ppy 9

编译器将在启用"禁用语言扩展"时发出错误,并在/ W4处发出警告.但是,删除此代码将破坏以前编译的代码,Microsoft非常不愿意这样做.这也是他们无法修复SFINAE支持的原因.