包含<string>且没有预编译头</string>时出现“警告C4350:行为更改”

时间:2012-10-18 16:27:41

标签: warnings visual-studio-2012 precompiled-headers

警告C4350说&#34;非const引用只能绑定到左值&#34;。我认为自从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 :: _ St​​ring_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 =标准:: _ St​​ring_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 :: _ St​​ring_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 =标准:: _ St​​ring_base_types&GT;

1&GT; ]

1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(700):参见类模板实例化&#39; std :: _ St​​ring_alloc&lt; _Al_has_storage,_Alloc_types&gt;&#39;正在编制

1&GT;与

1&GT; [

1&GT; _Al_has_storage =假,

1&GT; _Alloc_types =标准:: _ St​​ring_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 :: _ St​​ring_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 =标准:: _ St​​ring_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 :: _ St​​ring_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 =标准:: _ St​​ring_base_types&GT;

1&GT; ]

1&GT; c:\ program files(x86)\ microsoft visual studio 11.0 \ _vc \ include \ xstring(700):参见类模板实例化&#39; std :: _ St​​ring_alloc&lt; _Al_has_storage,_Alloc_types&gt;&#39;正在编制

1&GT;与

1&GT; [

1&GT; _Al_has_storage =假,

1&GT; _Alloc_types =标准:: _ St​​ring_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; ]

1 个答案:

答案 0 :(得分: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语句启用了警告。在属性设置中启用预编译头会导致pragma被忽略。谁知道?

如何解决问题,而不是忽略警告? - 没有修复它似乎,只是忽略警告