2011-03-17 177 views
3

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

这种差异可能会令人惊讶,并引发与其他行为不同的行为。 VS尤其因为模板代码验证过于松懈而着名,并且被VS接受和编译的模板代码通常会被更多的兼容编译器(CLang,Comeau,icc,gcc,...等等)彻底拒绝。

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

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

  • 解释这种差异
  • 告诉我们,如果有可能禁用此(如果有的话,怎么样)
  • 解释结果(除了纯粹的拒绝)

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

从@Matteo意大利:Visual Studio Compliance Page所有的

+0

你在找虫子呢?因为有一些错误不是扩展名。 – 2011-03-17 17:26:15

+1

如果Visual Studio是什么版本? – AnT 2011-03-17 17:33:40

+1

您需要指定一个版本。许多人发布的问题在VS2010中不存在。 – Puppy 2011-03-17 17:49:39

回答

6

首先,我会联系有关这个主题的微软服食。

可以找到所有的Microsoft语言扩展here;还有一个页面,其中列出了VC++不符合标准的areas of the language

+0

谢谢,我直接链接了问题中的合规问题:) – 2011-03-17 17:31:40

4

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

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

+0

有没有办法禁用这个?我真的很想知道在重载解决方案中与r值相关联。 – 2011-03-17 17:33:34

+1

GT是“禁用扩展”开关,但打破了Windows标头。 :-(它可以很好地与右值参考参数一起工作,因为这对于临时性来说会更好。 – 2011-03-17 17:37:11

+0

不,它没有,我只是试过了,2008也没有。 – Puppy 2011-03-17 17:49:17

1

的Visual C++不完全支持值初始化(或者更确切地说,有虫子在目前所有版本的Visual C++,从Visual C++ 2005通过Visual C++ 2010 SP1)。

有关于此的severalreportedbugs(另请参阅this answer to another question)。

后果:某些应该重新初始化对象的代码形式会使对象或对象的某些部分未初始化。

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

0

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

标准需要两个阶段的评价:

  • 第一:检查基本模板良构,结合非依赖性的名称(其包含过载分辨率)
  • 第二:实例化适当

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

后果:

的Visual Studio只做the second phase,从而影响:在模板代码

  • 错误只在实例被检测到,所以你最好实例,你早期写的所有的模板(把它看作编译单元测试)。
  • 丢失templatetypename关键字未被VS检测到
  • 重载决定后可能会拾取“模板”后声明的重载。没有太多的问题,因为恢复包含订单会产生相同的结果。
+0

这不是真的 - VS会抛出'typename'关键字。不过,不是'模板'。 – Puppy 2011-03-17 17:33:33

+0

@DeadMG:从内存中可以在类中编写'typedef T :: iterator迭代器;'而不会被编译器困扰。 – 2011-03-17 18:44:02

+0

这不完全正确。但是,有些情况下只会生成警告,而标准合规性则需要错误。 – 2011-03-26 10:41:20

0
+0

对不起,不准确的版本。我不知道有多少人仍在使用较旧版本的VS,但我希望大多数用户使用SO来使用更新版本(VS 9/VS 10)。 – 2011-03-17 18:45:07