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