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

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 из «char» в «char &»

Меня учили, что в C ++ неконстантный ссылочный параметр не может быть привязан к временному объекту; и в коде выше,f2(f1()); вызывает ошибку, как и ожидалось.

Однако почему это правило не применяется к строке кодаf4(f3());?

PS: Мой компилятор VC ++ 2013. Даже если я прокомментирую строкуf2(f1());затем код, содержащийf4(f3()); будет скомпилирован без каких-либо ошибок или предупреждений.

Обновить:

MSDN говорит:

В предыдущих выпусках Visual C ++ неконстантные ссылки могли быть связаны с временными объектами. Теперь временные объекты могут быть связаны только с константными ссылками.

Так что я думаю, что это ошибка VC ++. Я отправил отчет об ошибкеКоманда VC ++

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

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