Visual Studio 2010:扩展/差异 VisualStudio 2010具有多个扩展(默认激活)/关于C++标准的差异。
这种差异可能令人惊讶,并引发与其他行为不同的行为。VS以其在模板代码验证方面极为松懈而闻名,VS接受并编译的模板代码通常会被更为兼容的编译器(CLang、Comeau、icc、gcc等)彻底拒绝 这个问题的目的是为这些差异提供参考(因此是FAQ标签) 请为每个差异提供一个答案(检查重复项),并为每个差异提供:Visual Studio 2010:扩展/差异 VisualStudio 2010具有多个扩展(默认激活)/关于C++标准的差异。,c++,visual-studio,C++,Visual Studio,这种差异可能令人惊讶,并引发与其他行为不同的行为。VS以其在模板代码验证方面极为松懈而闻名,VS接受并编译的模板代码通常会被更为兼容的编译器(CLang、Comeau、icc、gcc等)彻底拒绝 这个问题的目的是为这些差异提供参考(因此是FAQ标签) 请为每个差异提供一个答案(检查重复项),并为每个差异提供: 解释差异 告诉我们是否可以禁用此功能(如果可以,如何禁用) 解释后果(除了拒绝之外) 注意:C++0x是下一个标准,因此避免列出C++0x扩展,因为它们很快就会成为标准 来自@Matt
- 解释差异
- 告诉我们是否可以禁用此功能(如果可以,如何禁用)
- 解释后果(除了拒绝之外)
来自@Matteo Italia:首先,我将链接微软对这个主题的看法
可以找到所有Microsoft语言扩展;还有一个页面列出了VC++不符合标准的地方。默认情况下,编译器允许将临时引用绑定到非常量引用
补救:使用警告级别4
< P> Visual C++不完全支持值初始化(或者,在Visual C++的所有当前版本中都存在bug,从Visual C++ 2005到Visual C++ 2010 SP1)。p> 关于这一点,有很多建议(另请参见) 结果:某些应初始化对象的代码形式使对象或对象的某些部分未初始化解决方法:不要依赖于值初始化。差异:在第一次求值期间,Visual Studio不会在模板中绑定非依赖名称 该标准要求两个阶段的评估:
- 第一:检查基本模板的格式是否良好,绑定非依赖名称(包括重载解析)
- 第二:正确实例化
- 模板代码中的错误只在实例化时检测到,所以最好尽早实例化所有编写的模板(将其视为编译单元测试)
- VS未检测到缺少
或模板
关键字类型名
- 在`模板之后声明的重载可以通过重载解析获取。问题不大,因为恢复包含顺序将产生相同的结果
您也在寻找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)。