gpt4 book ai didi

c++ - g++ 和 clang++ 不同的行为与静态成员的递归初始化

转载 作者:IT老高 更新时间:2023-10-28 12:41:52 25 4
gpt4 key购买 nike

给定以下代码:

#include <iostream>

template <std::size_t N>
struct foo
{ static std::size_t value; };

template <>
std::size_t foo<0>::value = 0u;

template <size_t N>
std::size_t foo<N>::value = 1u + foo<N - 1u>::value;

int main()
{
std::cout
<< foo<3u>::value << ' '
<< foo<2u>::value << ' '
<< foo<1u>::value << ' '
<< foo<0u>::value << std::endl;
}

其中静态成员value模板结构 foo是递归初始化的,我从 g++ 得到不同的输出:

3 2 1 0

来自 clang++:

1 1 1 0

看来 g++ 初始化了 foo<N>::value递归地使用 foo<N-1u>::value 的初始化值其中 clang++ 对 foo<N-1u>::value 使用零.

两个问题:

  1. 前面的代码是合法的还是在某种程度上是未定义的行为?
  2. 如果前面的代码是合法的,谁是对的:g++还是clang++?

最佳答案

未指定。两个编译器都是对的。

以下是来自 cppreference "initialization" 的相关文章.

静态初始化

For all other non-local static and thread-local variables, Zero initialization takes place

所以对于所有这些变量,它们在程序加载时都为零。那么:

动态初始化

After all static initialization is completed, dynamic initialization of non-local variables occurs in the following situations:

1) Unordered dynamic initialization, which applies only to (static/thread-local) class template static data members and ... that aren't explicitly specialized.

并且这些变量符合标准。然后它说:

Initialization of such static variables is indeterminately sequenced with respect to all other dynamic initialization ....

这意味着任何初始化序列都可以。两个编译器都是正确的。

为避免此问题,请改用 constexpr 强制“常量初始化”。

关于c++ - g++ 和 clang++ 不同的行为与静态成员的递归初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54981973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com