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 未检测到缺少的template
或 typename
关键字
在`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:扩展/差异的主要内容,如果未能解决你的问题,请参考以下文章
如何忽略 '$' 未定义 JsHint 错误。 (Visual Studio 2010 JsHint 扩展)
即使 using 语句不存在,Visual Studio 2010 扩展也可将扩展方法添加到智能感知
Visual Studio 2010/2012 Pro Power Tools