此代码是否定义了行为?
inline int a() { return 0 + a(); }
int main() { a(); }
如果启用优化,则 Clang 会对其进行优化,但 GCC 不会。所以代码在实践中不可移植。 C++ 规范对此有任何说明吗?
最佳答案
正如我在 this answer 中讨论的那样,无论是否存在 inline
关键字,您的代码的行为肯定是未定义的,因为您调用了这个函数:
[C++11: 1.10/24]:
The implementation may assume that any thread will eventually do one of the following:
- terminate,
- make a call to a library I/O function,
- access or modify a volatile object, or
- perform a synchronization operation or an atomic operation.
Clang 被允许省略整个事情,就像 GCC 被允许在没有内联的情况下运行它并达到堆栈溢出一样。编译器也可以自由尝试实际内联,在这种情况下甚至允许在编译期间崩溃。
至关重要的是,标准中没有任何规则可以使无限递归的语义仅仅因为一个函数被标记为 inline
或什至实际上是内联的([C++11: 7.1 .2]
).
当然,我认为如果您永远不会调用此函数,按照假设规则,编译器可以完全忽略它,那么您就没有问题了。
关于c++ - 内联无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22837126/