在第一段中,cpPreference.com明确指出throw(T1,。。。,Tn)
在C++17中被删除。
有些编译器在C++17模式下支持throw(T1,。。。,Tn)
(参见演示),这让我感到困惑。
/WE5040
转换为错误。-wno-dynamic-exception-spec
关闭该错误。编译器是否允许支持标准中删除的特性? 为了什么目的?
或者这只是一个编译器扩展,就像GCC中的void foo(int size){char a[size];}
,请参见演示。
对此没有单一的答案。
标准之外的一些东西可以作为纯增强处理。 这些增强中的一些是标准建议的(“如果X是实现依赖的”),有些甚至根本没有提到(#include
)。
对于其他方面,标准确实要求编译器标记违反标准的情况。 但该标准没有提到错误或警告。 相反,它说“诊断需要”,这被理解为一个错误或一个警告。 在其他情况下,它甚至说“不需要诊断”(NDR),这意味着编译器没有义务标记非标准代码。
因此,根据移除的特征,可能需要诊断,也可能不需要诊断。 如果它确实需要诊断,您通常可以告诉编译器,您对那个特定的诊断不感兴趣。
编译器是否允许支持标准中删除的特性?
标准不允许这样做。 AFAIK通常不会对以前存在于该语言中的特性进行任何特殊处理(不会将它们与不存在的特性分开)。
如果使用特定配置(即特定标志)的编译器没有诊断此错误(即没有给出错误或警告),那么它就不符合该配置中的标准。
但是要注意,完全符合标准实际上是不可能实现的。
一些编译器供应商比其他供应商更关心一致性。 微软对此不太关心(或者至少习惯了,他们一直在做这方面的工作)。
编译器是否允许支持标准中删除的特性? 为了什么目的?
编译器可以为所欲为。 C++标准规定了C++语言的规则,尽管他们确实咨询了编译器供应商以确保其规则是可实现的,但供应商自己会做他们认为对他们和他们的用户最有利的事情。 编译器有许多开发人员一直使用的非标准特性。 而且我认为这些编译器中没有任何一个在默认情况下完全遵守标准。
也就是说,如果编译器+设置允许非C++17代码或拒绝有效的C++17代码(正如标准所规定的),我不会将其称为“符合C++17”。 大多数编译器都有设置,如果需要完全遵从,则可以设置这些设置。
如果你想学究一点,MSVC由于缺少预处理器,甚至不符合C++11。 标准并不代表一切。