Временная привязка к ссылке lvalue

#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