Почему неконстантный параметр ссылки может быть связан с временным объектом?

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 ++

Ответы на вопрос(2)

Ваш ответ на вопрос