Предупреждение 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> ]