предупреждение C4350: изменение поведения при включении ‹string› и отсутствии предварительно скомпилированного заголовка

Предупреждение C4350 гласит: «Неконстантная ссылка может быть привязана только к lvalue». Я думаю, поскольку C4350 по умолчанию отключен, я мало что нашел о нем. Я прочитал этот пост, и он имеет смысл: Константная ссылка может быть привязана только к lvalue

Во всяком случае, я спрашиваю об этом, потому что пытаюсь обновить проекты VS2008 VC++ до VS2012. Когда я это делаю, я получаю сотни предупреждений C4350, которые я включил по какой-то устаревшей причине (которая, по общему признанию, может потребовать переоценки). Я сократил его до этого простого фрагмента кода, который может воспроизвести предупреждение, но только если у меня отключены предварительно скомпилированные заголовки:

#pragma warning(default:4350)

#include "stdafx.h"
#include <string>

int _tmain(int argc, char* argv[])
{
   return 0;
}

Если я включу предварительно скомпилированные заголовки, я не получу предупреждения. Я также не могу заставить это произойти в VS2008.

Является ли это ошибкой Visual Studio 2012 в std:string? Почему предварительно скомпилированный заголовок меняет поведение? Как решить проблему, а не просто игнорировать предупреждение? Спасибо!

Предупреждение (извините за плохое форматирование, это было лучшее, что я мог понять):

c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(689): предупреждение C4350: изменение поведения: 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc(const std::_Wrap_alloc‹_Alloc> & ) throw()' вызывается вместо 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc>(_Other &) throw()'

1> с

1> [

1> _Alloc=std::распределитель

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(838): см. объявление 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc'

1> с

1> [

1> _Alloc=std::распределитель

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(850): см. объявление 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc'

1> с

1> [

1> _Alloc=std::распределитель

1> ]

1> Неконстантная ссылка может быть привязана только к lvalue

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(688): при компиляции функции-члена шаблона класса 'std::_Wrap_alloc‹_Alloc> std::_String_alloc‹_Al_has_storage,_Alloc_types>:: _Getal(void) const'

1> с

1> [

1> _Alloc=std::распределитель,

1> _Al_has_storage=ложь,

1> _Alloc_types=std::_String_base_types>

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(898): см. ссылку на создание экземпляра шаблона функции 'std::_Wrap_alloc‹_Alloc> std::_String_alloc‹_Al_has_storage,_Alloc_types>:: _Getal(void) const' компилируется

1> с

1> [

1> _Alloc=std::распределитель,

1> _Al_has_storage=ложь,

1> _Alloc_types=std::_String_base_types>

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(700): см. ссылку на создание экземпляра шаблона класса 'std::_String_alloc‹_Al_has_storage,_Alloc_types>' при компиляции

1> с

1> [

1> _Al_has_storage=ложь,

1> _Alloc_types=std::_String_base_types>

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdexcept(31): см. ссылку на компилируемое создание экземпляра шаблона класса 'std::basic_string‹_Elem,_Traits,_Alloc>'

1> с

1> [

1> _Элем=символ,

1> _Traits=std::char_traits,

1> _Alloc=std::распределитель

1> ]

1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(689): предупреждение C4350: изменение поведения: 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc(const std::_Wrap_alloc‹_Alloc > &) throw()' вместо 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc>(_Other &) throw()'

1> с

1> [

1> _Alloc=std::распределитель

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(838): см. объявление 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc'

1> с

1> [

1> _Alloc=std::распределитель

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(850): см. объявление 'std::_Wrap_alloc‹_Alloc>::_Wrap_alloc'

1> с

1> [

1> _Alloc=std::распределитель

1> ]

1> Неконстантная ссылка может быть привязана только к lvalue

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(688): при компиляции функции-члена шаблона класса 'std::_Wrap_alloc‹_Alloc> std::_String_alloc‹_Al_has_storage,_Alloc_types>:: _Getal(void) const'

1> с

1> [

1> _Alloc=std::распределитель,

1> _Al_has_storage=ложь,

1> _Alloc_types=std::_String_base_types>

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(898): см. ссылку на создание экземпляра шаблона функции 'std::_Wrap_alloc‹_Alloc> std::_String_alloc‹_Al_has_storage,_Alloc_types>:: _Getal(void) const' компилируется

1> с

1> [

1> _Alloc=std::распределитель,

1> _Al_has_storage=ложь,

1> _Alloc_types=std::_String_base_types>

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(700): см. ссылку на создание экземпляра шаблона класса 'std::_String_alloc‹_Al_has_storage,_Alloc_types>' при компиляции

1> с

1> [

1> _Al_has_storage=ложь,

1> _Alloc_types=std::_String_base_types>

1> ]

1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\string(689): см. ссылку на компилируемое создание экземпляра шаблона класса 'std::basic_string‹_Elem,_Traits,_Alloc>'

1> с

1> [

1> _Elem=wchar_t,

1> _Traits=std::char_traits,

1> _Alloc=std::распределитель

1> ]


person Jacob    schedule 18.10.2012    source источник


Ответы (1)


Microsoft ответила на мой вопрос здесь:

http://connect.microsoft.com/VisualStudio/feedback/details/767960/warning-c4350-behavior-change-when-включая-string-and-no-precompiled-header

Обзор:

Является ли это ошибкой Visual Studio 2012 в std:string? — Они не считают это ошибкой, если выполняется чистая сборка на уровне предупреждения 4, что исключает это предупреждение.

Почему предварительно скомпилированный заголовок меняет поведение? — Компилятор игнорирует все, что идет перед предварительно скомпилированным заголовком, который в данном случае был моей прагмой, которая активировала предупреждение. Включение предварительно скомпилированных заголовков в настройках свойства привело к игнорированию прагмы. Кто знал?

Как мне решить проблему, а не просто игнорировать предупреждение? - Казалось бы, никакого решения, просто проигнорируйте предупреждение.

person Jacob    schedule 01.11.2012