«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему Visual Studio 2010 допускает неконстантную привязку ссылок к значениям R?

Почему Visual Studio 2010 допускает неконстантную привязку ссылок к значениям R?

Опубликовано 4 ноября 2024 г.
Просматривать:357

Why Does Visual Studio 2010 Allow Non-Const Reference Binding to Rvalues?

Разрешение привязки неконстантных ссылок к Rvalue: аномалия VS2010

Стандарт C строго запрещает привязку неконстантных ссылок к rvalue. Однако в результате странной аномалии Visual Studio 2010 (SP1) компилирует следующий код без каких-либо ошибок или предупреждений:

string foo() { return "hello"; }
int main() {
    string& tem = foo(); // Non-const reference to rvalue
}

Несоответствия в поведении компилятора

Напротив, другие компиляторы демонстрируют более строгое поведение:

  • GCC выдает ошибку компиляции, правильно определяя недопустимые привязка неконстантной ссылки к rvalue.
  • Visual Studio 2008 выдает предупреждение компиляции, признавая потенциальную проблему, но позволяя продолжить компиляцию.

Объяснение аномалии VS2010

Это необычное поведение в VS2010 связано с известным расширением компилятора. В отличие от GCC и Visual Studio 2008, VS2010 позволяет привязывать неконстантные ссылки к rvalue в определенных случаях, например, когда rvalue генерируется функцией, возвращающей временный объект.

Хотя это расширение не соответствует стандарту, вероятно, это было реализовано для удобства. Однако это может привести к неопределенному поведению, если значение rvalue будет изменено после привязки ссылки.

Последствия и рекомендации

Это расширение может вносить незначительные ошибки в код, основанный на о надлежащем соблюдении стандарта C. Поэтому настоятельно рекомендуется избегать привязки неконстантных ссылок к rvalue даже в VS2010. Вместо этого всегда используйте константные ссылки при привязке к значениям r, как это предусмотрено стандартом.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3