3

警告 C4350 说“非常量引用只能绑定到左值”。我认为由于默认情况下 C4350 处于关闭状态,因此我没有发现太多关于它的信息。我读过这篇文章,这很有意义: 非常量引用可能只绑定到一个左值

无论如何,我问它是因为我正在尝试将 VS2008 VC++ 项目更新到 VS2012。当我这样做时,我会收到数百个 C4350 警告,这些警告是由于某些遗留原因(诚然可能需要重新评估)而打开的。我已将其缩减为可以重现警告的简单代码,但前提是我已关闭预编译标头:

#pragma warning(default:4350)

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

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

如果我打开预编译的标头,我不会收到任何警告。我也不能让它在VS2008中发生。

这是 std:string 中的 Visual Studio 2012 错误吗?为什么预编译的标头会改变行为?我该如何解决这个问题,而不是仅仅忽略警告?谢谢!

警告是(抱歉格式不好,这是我能想到的最好的):

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> 非常量引用只能绑定到左值

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) 常量'

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> _Elem=字符,

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> 非常量引用只能绑定到左值

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) 常量'

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>]

4

1 回答 1

3

微软在这里回答了我的问题:

http://connect.microsoft.com/VisualStudio/feedback/details/767960/warning-c4350-behavior-change-when-including-string-and-no-precompiled-header

概括:

这是 std:string 中的 Visual Studio 2012 错误吗? - 如果干净地构建在警告级别 4(不包括此警告),他们不会将其视为错误

为什么预编译的标头会改变行为? - 编译器会忽略预编译标头之前的所有内容,在这种情况下,这是我启用警告的 pragma 语句。在属性设置中启用预编译头会导致编译指示被忽略。谁知道?

我该如何解决这个问题,而不是仅仅忽略警告? - 似乎没有修复,只是忽略警告

于 2012-11-01T16:31:10.790 回答