Разрешение привязки неконстантных ссылок к Rvalue: аномалия VS2010
Стандарт C строго запрещает привязку неконстантных ссылок к rvalue. Однако в результате странной аномалии Visual Studio 2010 (SP1) компилирует следующий код без каких-либо ошибок или предупреждений:
string foo() { return "hello"; }
int main() {
string& tem = foo(); // Non-const reference to rvalue
}
Несоответствия в поведении компилятора
Напротив, другие компиляторы демонстрируют более строгое поведение:
Объяснение аномалии VS2010
Это необычное поведение в VS2010 связано с известным расширением компилятора. В отличие от GCC и Visual Studio 2008, VS2010 позволяет привязывать неконстантные ссылки к rvalue в определенных случаях, например, когда rvalue генерируется функцией, возвращающей временный объект.
Хотя это расширение не соответствует стандарту, вероятно, это было реализовано для удобства. Однако это может привести к неопределенному поведению, если значение rvalue будет изменено после привязки ссылки.
Последствия и рекомендации
Это расширение может вносить незначительные ошибки в код, основанный на о надлежащем соблюдении стандарта C. Поэтому настоятельно рекомендуется избегать привязки неконстантных ссылок к rvalue даже в VS2010. Вместо этого всегда используйте константные ссылки при привязке к значениям r, как это предусмотрено стандартом.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3