内联无限递归

时间:2014-04-03 12:03:00

标签: c++

此代码是否定义了行为?

inline int a() { return 0 + a(); }

int main() { a(); }

如果启用了优化,那么Clang会优化它,但GCC不会。因此代码在实践中不可移植。 C ++规范是否对此有所说明?

1 个答案:

答案 0 :(得分:3)

正如我在this answer中讨论的那样,无论是否存在inline关键字,您调用此函数时代码的行为肯定是未定义的:

  

[C++11: 1.10/24]:实现可能会假设任何线程最终会执行以下操作之一:

     
      
  • 终止,
  •   
  • 调用库I / O函数,
  •   
  • 访问或修改易失性对象,或
  •   
  • 执行同步操作或原子操作。
  •   

允许Clang忽略整个事情,就像允许GCC运行它而不进行内联并达到堆栈溢出一样。编译器也可以自由地尝试实际内联,甚至允许在这种情况下编译时崩溃。

至关重要的是,标准中没有规则使得无限递归的语义不同只是因为函数被标记为inline或甚至实际内联([C++11: 7.1.2])。

当然,我认为如果你永远不会调用这个函数,那么通过as-if规则,编译器可以完全忽略它,然后你没有问题。