【发布时间】:2020-08-03 11:14:34
【问题描述】:
在第一段cppreference.com 中明确指出throw(T1, ..., Tn) 在C++17 中被删除。
令我困惑的是,一些编译器在 C++17 模式下支持 throw(T1, ..., Tn) (see demo)。
- MSVC 默认支持它,但您可以为其打开警告,请参阅C5040。可以使用
/we5040将其转换为错误。 - Clang 默认将其报告为错误,但可以使用
-Wno-dynamic-exception-spec关闭错误。 - GCC 让您别无选择:这是一个错误。
是否允许编译器支持标准中删除的功能?目的是什么?
或者这只是一个编译器扩展,比如 GCC 中的void foo(int size) { char a[size]; },参见demo。
【问题讨论】:
-
没有一个 C++ 编译器可以考虑为“标准”C++ 编译器,虽然它们都试图遵循标准,但在某些地方行为可能会有所不同。您遇到的只是编译器不同的示例之一,但 Clang 默认行为和 GCC 似乎正确引发编译错误。
-
@rustyx:谢谢,我忽略了这一点。我从问题中删除了这部分,因为它显然是 cppreference.com 中的一个错字。
-
编译器并不局限于仅支持 c++ 标准。所有这些编译器都有不遵守规则的编译选项(默认情况下有一些)。这个案子对我来说似乎没有什么不同。
-
那么“标准”实际上标准化了什么?是否有一个编译器需要支持才能被称为“有效的 c++17(或 c++14/20 等)”编译器的列表?
-
@Roy2511 “需要支持的事物列表”就是标准本身。该标准标准化了想要称自己为“有效的 C++xx 编译器”的程序以及它们生成的程序的行为。
标签: c++ c++17 language-lawyer exception-specification