【发布时间】:2015-02-26 11:04:23
【问题描述】:
在以下库代码中:
#include <cmath>
namespace blah {
const double pi=4.0*std::atan(1.0);
}
template <int I>
class ClassB
{
public:
ClassB() {myval = blah::pi;}
private:
double myval;
};
template <int I>
class ClassA
{
public:
static ClassB<I> b;
};
template<int I>
ClassB<I> ClassA<I>::b = ClassB<I>();
template class ClassA<3>;
标准保证变量pi在ClassB的构造函数使用之前赋值给它的值4.0*std::atan(1.0)?
据我所知,pi 和 static ClassA<I>::ClassB<I> b 应该按照它们在单个翻译单元中定义的顺序进行初始化 - 因此应该首先初始化 pi。
但是,在具有上述代码结构的真实代码库中,我发现在 Clang 3.6 编译的代码中,pi 在执行 ClassB 构造函数时等于零,并被初始化为只有在此之后它的正确值。
(如我所料,GCC 4.8.3 首先初始化 pi。)
【问题讨论】:
标签: c++ initialization