Получение ссылки на временную переменную:Возвращение локального объекта примитивного типа и на структуру
struct S
{
S() = default;
S(const S& other) = delete;
S(S&& other) = delete;
~S(){}
};
S foo1()
{
return {}; // RVO (???)
}
int foo2()
{
return 42; // RVO
}
int main()
{
S& i = foo1(); // compiles!
int& i2 = foo3(); // error C2440: 'initializing' : cannot convert from 'int' to 'int &'
}
Я знаю о продлении ссылки жизни с const
спецификатора. И понятно, почему foo2
дает сообщение об ошибке. Но почему работает foo1
?
PS: протестировано с VS2013/15
'S & i = foo()' не следует компилировать. 'foo' возвращает временные и временные не могут быть привязаны к неконстантным ссылкам. – emlai
Забавный, я думаю, что он не должен компилироваться на нескольких фронтах - даже если копия ctor никогда не выполняется, она все равно должна присутствовать, если S возвращается значением, не так ли? –
С другой стороны, компилятор, вероятно, может оптимизировать весь исполняемый файл в NOP под правилом as-if. –