Временное связывание со ссылкой на lvalue - PullRequest
9 голосов
/ 28 августа 2009

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

string three()
{
    return "three";
}

void mutate(string& ref)
{
}

int main()
{
    mutate(three()); 
    return 0;
}

Вы видите, что я передаю three () в mutate метод. Этот код хорошо компилируется. Насколько я понимаю, временные ссылки не могут быть отнесены к неконстантным ссылкам. Если да, то как эта программа компилируется?

Есть мысли?

Изменить:

Испытанные компиляторы: VS 2008 и VS2010 Beta

Ответы [ 5 ]

8 голосов
/ 28 августа 2009

Раньше он компилировался в компиляторе VC6, поэтому я предполагаю, что для обеспечения обратной совместимости VS2008 поддерживает это нестандартное расширение. Попробуйте с флагом / Za (отключить расширение языка), тогда вы получите сообщение об ошибке.

4 голосов
/ 28 августа 2009

Это злое расширение VC ++. Если вы oompile с / W4, то компилятор предупредит вас. Я предполагаю, что вы читаете Rvalue Список литературы: C ++ 0x Особенности в VC10, Часть 2 . Эта статья также упоминала эту проблему.

3 голосов
/ 28 августа 2009

Это расширение Microsoft, имитирующее поведение многих других компиляторов Microsoft. Если вы включите предупреждения W4, вы увидите предупреждение.

1 голос
/ 28 августа 2009

Это не компилируется, по крайней мере, с 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 и 'using'.)

Итак, ваш компилятор не такой строгий, как должен быть.

0 голосов
/ 28 августа 2009

Полагаю, это зависит от компилятора. 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.

Возможно, потому что вы ничего не делаете, вызов оптимизирован.

...