c++ - 内联无限递归

标签 c++

此代码是否定义了行为?

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/

相关文章:

c++ - 如何在 C++ 中使用迭代器反转列表

c++ - 如何打印出 vector 的内容?

c++ - std::pair<> 的默认构造函数是否将基本类型(int 等)设置为零?

c++ - FindResource() 的问题

c++ - 如何向类发送回调

c++ - 如何在单个案例中通过多个 catch block 使异常处理落空?

c++ - 反转字符数组

c++ - 将罗马数字转换为 Int - 得到错误的输出 - 为什么?

c++ - 尝试使用嵌套的 for 循环输出某些内容

Java native 接口(interface) GetStringUTFChars fatal error