MSVC将非常量左值引用绑定到右值/临时

时间:2018-11-03 23:10:02

标签: c++ c++11 visual-c++ language-lawyer c++98

MSVC使您可以将非常量左值引用绑定到右值/临时值。我已经用下面的代码测试了VS2008,VS2010,VS2012,VS2015和多个VS2017,其中Clang 3-8和GCC 4-9给出了错误。

struct dummy {};
template <typename T> void foo(T&) {}
template <typename T> T bar() { return T(); }

int main()
{
    //int& i = 1;       // 1. Fails as expected on all compilers
    //foo(1);           // 2. Fails as expected on all compilers
    //foo(bar<int>());  // 3. Fails as expected on all compilers
    dummy& d = dummy(); // 4. OK on MSVC
    foo(dummy());       // 5. OK on MSVC
    foo(bar<dummy>());  // 6. OK on MSVC
}

https://godbolt.org/z/1u5EVD

不是所有这些情况都被禁止 [dcl.init.ref]/5.2?我想念什么吗?有人应该注意到MSVC几十年来一直违反该标准的基础。

0 个答案:

没有答案