Почему неконстантный параметр ссылки может быть связан с временным объектом?
char f1();
void f2(char&);
struct A {};
A f3();
void f4(A&);
int main()
{
f2(f1()); // error C2664. This is as expected.
f4(f3()); // OK! Why???
}
ошибка C2664: 'void f4 (char &) ' : невозможно преобразовать аргумент 1 из 'символ» ксимвол &
Меня учили, что в C ++ неконстантный ссылочный параметр не может быть привязан к временному объекту; и в коде выше,f2(f1());
вызывает ошибку, как и ожидалось.
Однако, почему это же правило не применяется к строке кода?f4(f3());
PS: Мой компилятор VC ++ 2013. Даже если я прокомментирую строкуf2(f1());
затем код, содержащийf4(f3());
будет скомпилирован без каких-либо ошибок или предупреждений.
Обновить:
MSDN говорит:
В предыдущих выпусках Visual C ++ неконстантные ссылки могли быть связаны с временными объектами. Теперь временные объекты могут быть связаны только с константными ссылками.
Так что я думаю, что это ошибка VC ++. Я отправил отчет об ошибкеКоманда VC ++