Несколько лет спустя и многие версии Visual Studio у нас все еще есть это «расширение», вызывающее сюрпризы и головные боли. Вздох ...
Исправление состоит в том, чтобы просто превратить предупреждение C4239 в ошибку. Это предотвратит компиляцию кода MSVC, который пытается привязать неконстантную ссылку lvalue к временному, и даст вам хорошую ясную ошибку компилятора. Просто добавьте /we4239
в определения вашего компилятора или cl
аргументы командной строки.
В Visual Studio:
Свойства проекта> C / C ++> Все параметры> Рассматривать определенные предупреждения как ошибки> добавьте 4239
и убедитесь, что все остальные числа разделены точкой с запятой.
В CMake:
if(MSVC)
add_definitions("/we4239")
endif()
Кажется, это работает намного лучше, чем отключение всех языковых расширений с помощью /Za
, что официально не рекомендуется. На моей большой базе кода добавление /Za
вызвало более 1500 ошибок компиляции из собственного заголовка winnt.h
в Microsoft.