В следующем коде библиотеки:C++ инициализация: порядок Const глобального против статического члена класса
#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
гарантирован стандартом, который будет назначена его значение 4.0*std::atan(1.0)
перед конструктором ClassB
использует его?
Насколько я могу сказать от стандарта, pi
и static ClassA<I>::ClassB<I> b
должны быть инициализированы в том порядке, в котором они определены в этом одном ЕПЕ - и, таким образом, pi
должен быть инициированным первым.
Однако в моей реальной кодовую со структурой кода, как описано выше, я нахожу, что в коде, составленному Clang 3.6 pi
равна нулю в то время, когда ClassB
конструктор выполняется, и инициализируется его правильное значение только после этого. (GCC 4.8.3 Инициализация pi
сначала, как ожидалось.)