Visual Studio 2010:扩展/差异

Posted

技术标签:

【中文标题】Visual Studio 2010:扩展/差异【英文标题】:Visual Studio 2010: extensions / discrepancies 【发布时间】:2011-03-17 17:18:47 【问题描述】:

Visual Studio 2010 具有许多与 C++ 标准相关的扩展(默认激活)/差异。

这种差异可能会令人惊讶,并引发与其他行为不同的行为。 VS 以在模板代码验证方面极其松懈而闻名,被 VS 接受和编译的模板代码通常会被更兼容的编译器(CLang、Comeau、icc、gcc 等等)直接拒绝。

这个问题的目的是为这些差异提供参考(因此是 FAQ 标签)。

请为每个差异提供一个答案(检查是否重复)和每个:

解释差异 告诉我们是否可以禁用此功能(如果可以,如何禁用) 解释后果(除了拒绝)

注意:C++0x 是下一个标准,因此请避免列出 C++0x 扩展,因为它们很快就会成为标准

来自@Matteo Italia:Visual Studio Compliance Page

【问题讨论】:

您也在寻找错误吗?因为有些bug不是扩展。 Visual Studio 是什么版本? 您需要指定一个版本。很多人都在发布 VS2010 中不会出现的问题的答案。 @DeadMG,@AndreyT:让我们关注VS2010,因为它更合规,早期版本的市场份额应该会逐渐下降。 @James:是的,我也将错误视为差异。它们总是不利于便携性。 @Matthieu:如果您想为每个错误和/或一组错误提供答案...我不知道该怎么礼貌地说,但是:需要一个整体很多答案。 :-| 【参考方案1】:

首先,我将链接微软对这个主题的看法。

所有微软语言扩展都可以在here找到;还有一个页面列出了 VC++ 不符合标准的areas of the language。

【讨论】:

谢谢,我已将问题中的合规性问题直接联系起来:)【参考方案2】:

默认情况下,编译器允许将临时值绑定到非常量引用。

补救措施:使用警告级别 4

【讨论】:

有没有办法禁用这个?我真的很想知道在重载解析期间将此与 r 值引用结合使用。 G有“禁用扩展”开关,但这会破坏 Windows 标头。 :-( 它适用于右值引用参数,因为这将是一个更好的临时匹配。【参考方案3】:

Visual C++ 不完全支持值初始化(或者说,从 Visual C++ 2005 到 Visual C++ 2010 SP1 的所有当前版本的 Visual C++ 中都存在错误)。

关于这个有severalreportedbugs(另见this answer to another question)。

后果:某些形式的代码应该初始化一个对象,导致对象或对象的某些部分未初始化。

解决方法:不要依赖值初始化。

【讨论】:

【参考方案4】:

差异:Visual Studio 不会在第一次评估期间绑定模板中的非依赖名称。

标准要求两阶段评估:

首先:检查基本模板的格式是否正确,绑定不依赖的名称(包括重载解析) 第二个:适当的实例化

禁用?它不受任何选项或开关的影响,它根本没有实现。

后果:

Visual Studio 只执行the second phase,这会影响:

模板代码中的错误仅在实例化时被检测到,因此您最好实例化您早期编写的所有模板(将其视为编译单元测试)。 VS 未检测到缺少的 templatetypename 关键字 在`template 之后声明的重载可能会被重载决议拾取。这不是什么大问题,因为还原包含顺序会产生相同的结果。

【讨论】:

这不是真的——VS 会抛出 typename 关键字。不过不是template @DeadMG:从内存中可以在一个类中写入typedef T::iterator iterator; 而不会被编译器打扰。 这并不完全正确。但是,在某些情况下只会生成警告,而符合标准则需要出错。【参考方案5】:

我将博客用作我在 VS2005 中发现的不合规问题的笔记本。我认为在这里重新发布整个内容没有意义

http://atarasevich.blogspot.com/2008/02/microsoft-vs2005-c-non-compliance.html

http://atarasevich.blogspot.com/2008/02/microsoft-vs2005-c-non-compliance_07.html

http://atarasevich.blogspot.com/2008/02/microsoft-vs2005-c-non-compliance_08.html

【讨论】:

很抱歉没有精确的版本。我不知道有多少人仍在使用旧版本的 VS,但我预计大多数使用 SO 的用户会使用更新的版本(VS 9 / VS 10)。

以上是关于Visual Studio 2010:扩展/差异的主要内容,如果未能解决你的问题,请参考以下文章

执行代码扩展的Visual Studio 2010扩展

如何忽略 '$' 未定义 JsHint 错误。 (Visual Studio 2010 JsHint 扩展)

即使 using 语句不存在,Visual Studio 2010 扩展也可将扩展方法添加到智能感知

Visual Studio 2010/2012 Pro Power Tools

无法在 Visual Studio 2010 Phone Express 上安装 Nuget Manager 扩展

Visual Studio 的“自动解析”功能不适用于扩展方法 - 现在怎么办?