#c #opencv #rvalue #temporary-objects
#c #компилятор-конструкция #lvalue #rvalue
Вопрос:
У меня есть следующий код
string three()
{
return "three";
}
void mutate(stringamp; ref)
{
}
int main()
{
mutate(three());
return 0;
}
Вы можете видеть, что я передаю метод three() для изменения метода. Этот код хорошо компилируется. Насколько я понимаю, временные значения не могут быть назначены неконстантным ссылкам. Если да, то как компилируется эта программа?
Есть мысли?
Редактировать:
Компиляторы пытались: бета-версии VS 2008 и VS2010
Комментарии:
1. Попробуйте GCC, он более близок к стандарту C .
2. К сожалению, у меня нет с собой GCC.
3. @Appu: После того, как я исправил ваш код из-за отсутствия включений и
std
префиксов, Comeau ( comeaucomputing.com/tryitout ) говорит:initial value of reference to non-const must be an lvalue
. Причина, по которой VC принимает это, заключается в том, что VC сломан. (Они называют это «особенностью», но на самом деле это ошибка.)
Ответ №1:
Раньше он компилировался в компиляторе VC6, поэтому я предполагаю, что для поддержания обратной совместимости VS2008 поддерживает это нестандартное расширение. Попробуйте с флагом /Za (отключить расширение языка), тогда вы должны получить сообщение об ошибке.
Комментарии:
1. Указание
/Za
параметра может привести к проблемам с включениемwindows.h
или другими специфичными для Windows заголовками.2. Использование уровня предупреждения как четвертого — лучший вариант, который я использовал
Ответ №2:
Это злое расширение VC . Если вы скомпилируете файл с помощью /W4, компилятор предупредит вас. Я предполагаю, что вы читаете ссылки на значения Rvalue: функции C 0x в VC10, часть 2. В этой статье также упоминалась эта проблема.
Ответ №3:
Это расширение Microsoft, имитирующее поведение многих других компиляторов Microsoft. Если вы включите предупреждения W4, вы увидите предупреждение.
Ответ №4:
Он не компилируется, по крайней мере, с g 4:
foo.cpp: In function ‘int main()’:
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::stringamp;’ from a temporary of type ‘std::string’
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::stringamp;)’
(Номера строк отклонены на 3 или 4, потому что мне пришлось добавить строки #include и ‘using’.)
Итак, ваш компилятор, похоже, не такой строгий, каким должен быть.
Комментарии:
1. Отредактированный пост и добавленные компиляторы, которые я использую.
Ответ №5:
Я думаю, это зависит от компилятора. g 4.1.2 дает мне это.
In function 'int main()':
Line 15: error: invalid initialization of non-const reference of type 'std::stringamp;' from a temporary of type 'std::string'
compilation terminated due to -Wfatal-errors.
Возможно, из-за того, что вы ничего не делаете, вызов оптимизируется.
Комментарии:
1. Я попытался что-то сделать с параметром ref внутри метода mutate(), и он все еще компилируется
2. Я только что попробовал это в VC , и он компилируется и работает, если вы не отключите расширения в свойствах проекта. Когда вы это сделаете, вы получите следующее: 1>main.cpp 1>d:allprojectslaptop2asdasdmain.cpp (16) : ошибка C2664: ‘mutate’: не удается преобразовать параметр 1 из ‘std:: string’ в ‘std:: string amp;’ 1> Неконстантная ссылка может быть привязана только к значению lvalue