MSVC позволяет связать неконстантную ссылку на lvalue с rvalue / временным. Я протестировал 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 нарушает основы стандарта на протяжении десятилетий.