警告C4350说"非const引用只能绑定到左值"。我认为自从C4350默认关闭后我就找不到它了。我看过这篇文章有道理: Non-const reference may only be bound to an lvalue
无论如何,我问这个问题是因为我试图将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:行为改变:&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc(const std: :_Wrap_alloc&lt; _Alloc&gt;&amp;)throw()&#39;调用而不是&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc&gt;(_ Other&amp;)throw()&#39;
1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xmemory0(838):参见&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc&#39;
的声明1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xmemory0(850):参见&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc&#39;
的声明1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器
1&GT; ]
1&GT;非const引用只能绑定到左值
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(688):同时编译类模板成员函数&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; std :: _ String_alloc&lt; _Al_has_storage,_Alloc_types&gt; :: _ Getal(void)const&#39;
1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器,
1&GT; _Al_has_storage =假,
1&GT; _Alloc_types =标准:: _ String_base_types&GT;
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(898):参见函数模板实例化&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; std :: _ String_alloc&lt; _Al_has_storage,_Alloc_types&gt; :: _ Getal(void)const&#39;正在编制
1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器,
1&GT; _Al_has_storage =假,
1&GT; _Alloc_types =标准:: _ String_base_types&GT;
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(700):参见类模板实例化&#39; std :: _ String_alloc&lt; _Al_has_storage,_Alloc_types&gt;&#39;正在编制
1&GT;与
1&GT; [
1&GT; _Al_has_storage =假,
1&GT; _Alloc_types =标准:: _ String_base_types&GT;
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ stdexcept(31):参见类模板实例化&#39; std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&#39;正在编制
1&GT;与
1&GT; [
1&GT; _Elem =炭,
1&GT; _Traits =标准:: char_traits,
1&GT; _Alloc =标准::分配器
1&GT; ]
1&gt; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(689):警告C4350:行为更改:&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc(const std :: _ Wrap_alloc&lt; _Alloc&gt;&amp;)throw()&#39;调用而不是&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc&gt;(_ Other&amp;)throw()&#39;
1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xmemory0(838):参见&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc&#39;
的声明1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xmemory0(850):参见&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; :: _ Wrap_alloc&#39;
的声明1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器
1&GT; ]
1&GT;非const引用只能绑定到左值
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(688):同时编译类模板成员函数&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; std :: _ String_alloc&lt; _Al_has_storage,_Alloc_types&gt; :: _ Getal(void)const&#39;
1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器,
1&GT; _Al_has_storage =假,
1&GT; _Alloc_types =标准:: _ String_base_types&GT;
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(898):参见函数模板实例化&#39; std :: _ Wrap_alloc&lt; _Alloc&gt; std :: _ String_alloc&lt; _Al_has_storage,_Alloc_types&gt; :: _ Getal(void)const&#39;正在编制
1&GT;与
1&GT; [
1&GT; _Alloc =标准::分配器,
1&GT; _Al_has_storage =假,
1&GT; _Alloc_types =标准:: _ String_base_types&GT;
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(700):参见类模板实例化&#39; std :: _ String_alloc&lt; _Al_has_storage,_Alloc_types&gt;&#39;正在编制
1&GT;与
1&GT; [
1&GT; _Al_has_storage =假,
1&GT; _Alloc_types =标准:: _ String_base_types&GT;
1&GT; ]
1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ string(689):参见类模板实例化&#39; std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&#39;正在编制
1&GT;与
1&GT; [
1&GT; _Elem = wchar_t的,
1&GT; _Traits =标准:: char_traits,
1&GT; _Alloc =标准::分配器
1&GT; ]
答案 0 :(得分:3)
微软在这里回答了我的问题:
<强>要点:强>
这是std:string中的Visual Studio 2012错误吗? - 如果干净地建立在警告级别4(不包括此警告
),他们不会将其视为错误为什么预编译头会改变行为? - 编译器忽略预编译头之前的所有内容,在这种情况下,我的pragma语句启用了警告。在属性设置中启用预编译头会导致pragma被忽略。谁知道?
如何解决问题,而不是忽略警告? - 没有修复它似乎,只是忽略警告