【问题标题】:Visual Studio 2010: extensions / discrepanciesVisual Studio 2010:扩展/差异
【发布时间】: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:如果您想为每个错误和/或一组错误提供答案...我不知道该怎么礼貌地说,但是:需要一个整体很多答案。 :-|

标签: c++ visual-studio


【解决方案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】:

    【讨论】:

    • 很抱歉没有精确的版本。我不知道有多少人仍在使用旧版本的 VS,但我预计大多数使用 SO 的用户会使用更新的版本(VS 9 / VS 10)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多