Вопрос

У меня есть следующий код

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.

Может быть, потому что вы ничего не делаете, вызов оптимизируется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top