Visual Studio 2010:扩展/差异 VisualStudio 2010具有多个扩展(默认激活)/关于C++标准的差异。

Visual Studio 2010:扩展/差异 VisualStudio 2010具有多个扩展(默认激活)/关于C++标准的差异。,c++,visual-studio,C++,Visual Studio,这种差异可能令人惊讶,并引发与其他行为不同的行为。VS以其在模板代码验证方面极为松懈而闻名,VS接受并编译的模板代码通常会被更为兼容的编译器(CLang、Comeau、icc、gcc等)彻底拒绝 这个问题的目的是为这些差异提供参考(因此是FAQ标签) 请为每个差异提供一个答案(检查重复项),并为每个差异提供: 解释差异 告诉我们是否可以禁用此功能(如果可以,如何禁用) 解释后果(除了拒绝之外) 注意:C++0x是下一个标准,因此避免列出C++0x扩展,因为它们很快就会成为标准 来自@Matt

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

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

请为每个差异提供一个答案(检查重复项),并为每个差异提供:

  • 解释差异
  • 告诉我们是否可以禁用此功能(如果可以,如何禁用)
  • 解释后果(除了拒绝之外)
注意:C++0x是下一个标准,因此避免列出C++0x扩展,因为它们很快就会成为标准


来自@Matteo Italia:

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


可以找到所有Microsoft语言扩展;还有一个页面列出了VC++不符合标准的地方。

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


补救:使用警告级别4

< P> Visual C++不完全支持值初始化(或者,在Visual C++的所有当前版本中都存在bug,从Visual C++ 2005到Visual C++ 2010 SP1)。p> 关于这一点,有很多建议(另请参见)

结果:某些应初始化对象的代码形式使对象或对象的某些部分未初始化


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

差异:在第一次求值期间,Visual Studio不会在模板中绑定非依赖名称

该标准要求两个阶段的评估:

  • 第一:检查基本模板的格式是否良好,绑定非依赖名称(包括重载解析)
  • 第二:正确实例化
禁用?它不受任何选项或开关的约束,只是没有实现

后果:

Visual Studio仅提供此功能,这会影响:

  • 模板代码中的错误只在实例化时检测到,所以最好尽早实例化所有编写的模板(将其视为编译单元测试)
  • VS未检测到缺少
    模板
    类型名
    关键字
  • 在`模板之后声明的重载可以通过重载解析获取。问题不大,因为恢复包含顺序将产生相同的结果

我使用博客作为我在VS2005中发现的非共犯问题的笔记本。我看不出在这里重新发布整个事件有什么意义


您也在寻找bug吗?因为有些bug不是扩展。如果Visual Studio是什么版本?您需要指定一个版本。很多人都在发布VS2010中没有出现的问题的答案。@DeadMG,@AndreyT:让我们关注VS2010,因为它更兼容,早期版本的市场份额应该会逐渐下降@杰姆斯:我也认为错误是不一致的,是的。它们的可移植性总是让人讨厌。@Matthieu:如果你想知道每个bug和/或一组bug的答案。。。我不知道该如何礼貌地说,但是:需要有很多答案-|谢谢,我已经将问题中的合规性问题直接联系起来:)这不是真的-VS将抛出
typename
关键字。但不是
模板
。@DeadMG:可以从内存中编写
typedef T::iterator iterator在一个类中,不受编译器的干扰。这不是完全正确的。但是,在某些情况下,只会生成警告,而标准合规性要求出现错误。是否无法禁用此警告?在重载解析期间,我真的很想知道这与r值引用的关系。这里有一个“禁用扩展”开关,但它会破坏Windows标题:-(它与右值引用参数配合得很好,因为这将更好地匹配临时版本。很抱歉没有精确说明版本。我不知道有多少人仍在使用较旧版本的VS,但我预计大多数用户会使用较新版本(VS 9/VS 10)。