这是一个由两部分组成的问题,第一部分是关于完全用C++编写的东西,第二部分是关于用C编写但从C++调用的函数之间的交互。
第 1 部分
让不同的翻译单元在同一函数的声明上看到不同的noexcept
说明符是 ODR 还是其他违规行为?具体来说,如果一个单元看到:
void foo();
而另一个看到:
void foo() noexcept;
是 ODR 还是其他违规行为?你可以假设函数在现实中永远不会抛出(即,它实际上可以声明为noexcept
(。
第 2 部分
如果所有代码都C++将声明视为extern "C" void foo() noexcept;
,但该函数实际上是在 C 中定义(实现(的,而声明(显然(不包括noexcept
,这是否违规?
这是一个 ODR ...违反?
这不是违反 ODR 的行为。这些:
void foo(); void foo() noexcept;
只是声明。它们不是定义,一个定义规则不会限制它们。
是...其他违规行为?
是的。它违反了以下规则(引自最新的Satandard草案(:
[规格除外]
如果一个函数的声明没有noexcept-specitor,则该声明有一个潜在的抛出异常规范,除非[不适用的异常],在这种情况下,异常规范如下所述,并且该函数的其他声明不应具有noexcept-specitor。仅当单个翻译单元中的异常规范不同时,才需要诊断。
如果所有C++代码都将声明视为 extern "C" void foo(( noexcept;,但该函数实际上是在 C 中定义(实现(的,而声明(显然(不包括 noexcept,这是否违规?
从技术上讲,也许吧。但是C++标准并不真正适用于 C,所以这可能被低估了。即使程序在技术上格式不正确,我也不确定如果一个 TU 认为只要该函数从不抛出,该函数就noexcept
,是否存在任何实际问题。
值得一提的是,glibc 仅在包含 C++ 时才使用 GCC 时声明标准 C 函数,并带有throw()
。