Привязка временной к ссылке LVALUE
-
20-09-2019 - |
Вопрос
У меня есть следующий код
string three()
{
return "three";
}
void mutate(string& ref)
{
}
int main()
{
mutate(three());
return 0;
}
Вы можете видеть, что я прохожу три() к мутат метод Этот код хорошо компилируется. Насколько я понимаю, временные не могут быть назначены неконфектным ссылкам. Если да, то, как эта программа компилируется?
Какие-нибудь мысли?
Редактировать:
Компиляторы пробовали: VS 2008 и VS2010 бета
Решение
Он использовал для компиляции в компиляторе VC6, поэтому я думаю, что для поддержания обратной композиции VS2008 поддерживает это нестандартное расширение. Попробуйте с /Za (Отключить расширение языка) Флаг, вы должны получить ошибку тогда.
Другие советы
Это злое расширение VC ++. Если вы Oompile с /w4, то компилятор предупредит вас. Я думаю, ты читаешь Ссылки RVALUE: C ++ 0x функции в VC10, часть 2. Анкет В этой статье также упоминалась этот вопрос.
Это расширение Microsoft, чтобы имитировать поведение многих других компиляторов Microsoft. Если вы включите предупреждения W4, вы увидите предупреждение.
Это не Компилируйте, по крайней мере, с G ++ 4:
foo.cpp: In function ‘int main()’:
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’
(Номера строк выключены на 3 или 4, потому что мне пришлось добавить #include и «использование» линий.)
Таким образом, ваш компилятор кажется не таким строгим, как должен быть.
Я думаю, это зависит от компилятора. G ++ 4.1.2 дает мне это.
In function 'int main()':
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'
compilation terminated due to -Wfatal-errors.
Может быть, потому что вы ничего не делаете, вызов оптимизируется.