gpt4 book ai didi

c++ - 当到达 main() 时,由全局变量的构造函数初始化的静态模板变量为空

转载 作者:太空宇宙 更新时间:2023-11-04 13:24:53 25 4
gpt4 key购买 nike

请看下面的示例代码

template < typename TYPE >
struct foo
{
static TYPE bar;
};

template < typename TYPE >
TYPE foo < TYPE >::bar;

template < typename RET, typename... ARGS >
struct changer
{
typedef std::function < RET ( ARGS... ) > type;

static void set ( type v ) { foo < type >::bar = v; }

static type get () { return foo < type >::bar; }
};

void custom_func ( int i )
{
std::cout << "called with " << i << std::endl;
}

struct initializer
{
typedef changer < void, int > changer_t;

initializer ()
{
changer_t::set ( std::bind ( & custom_func, std::placeholders::_1 ) );
call ( 1 );
}

void call ( int v )
{
auto myfunc = changer_t::get ();

if ( myfunc ) myfunc ( v );
else std::cout << "myfunc is empty" << std::endl;
}
};

initializer x;

int main()
{
x.call ( 2 );

return 0;
}

该程序的输出是

called with 1
myfunc is empty

当我将 foochanger 更改为非模板代码时

struct foo
{
static std::function < void ( int ) > bar;
};

std::function < void ( int ) > foo::bar;

struct changer
{
typedef std::function < void ( int ) > type;

static void set ( type v ) { foo::bar = v; }

static type get () { return foo::bar; }
};

第一个版本的输出也是我所期望的:

called with 1
called with 2

这里发生了什么?我怎样才能让它与模板版本一起工作?

使用 MSVC2013 和 g++ 测试 templated | not-templated

更新:我只是不小心在VS中构建了 Release模式,其中模板版本输出

called with 1
called with 2

...我在逗 UB 吗?

最佳答案

模板的静态成员具有无序初始化。这意味着 bar 可能(但也可能不会)为您的目的初始化得太晚 - 在 x 初始化之后。

(非模板并非如此,这就是为什么这种情况适合您。)

另见 Initialization order of static data inside class template .

关于c++ - 当到达 main() 时,由全局变量的构造函数初始化的静态模板变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716606/

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