此代码是否定义了行为?
inline int a() { return 0 + a(); }
int main() { a(); }
如果启用了优化,那么Clang会优化它,但GCC不会。因此代码在实践中不可移植。 C ++规范是否对此有所说明?
答案 0 :(得分:3)
正如我在this answer中讨论的那样,无论是否存在inline
关键字,您调用此函数时代码的行为肯定是未定义的:
[C++11: 1.10/24]:
实现可能会假设任何线程最终会执行以下操作之一:
- 终止,
- 调用库I / O函数,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作。
允许Clang忽略整个事情,就像允许GCC运行它而不进行内联并达到堆栈溢出一样。编译器也可以自由地尝试实际内联,甚至允许在这种情况下编译时崩溃。
至关重要的是,标准中没有规则使得无限递归的语义不同只是因为函数被标记为inline
或甚至实际内联([C++11: 7.1.2]
)。
当然,我认为如果你永远不会调用这个函数,那么通过as-if规则,编译器可以完全忽略它,然后你没有问题。