struct Cl1{ Cl1(int); };
struct Cl2{ Cl2(int,Cl1); };
struct A
{ static const int i0=0;
static const Cl1 m1(i0); // ?
static const Cl2 m2(i0,M1); // ?
};
Чет типа такое. Хочу константные i0,m1,m2. Компилятор ругается в скобках не типы — видимо считает m1, m2 декларацией функции. Мне нужны инициализированные члены данные. Как?
Здравствуйте, Honduras, Вы писали:
H>Хочу константные i0,m1,m2. Компилятор ругается в скобках не типы — видимо считает m1, m2 декларацией функции. Мне нужны инициализированные члены данные. Как?
struct A
{ static const int i0=0;
static const Cl1 m1;
static const Cl2 m2;
};
const Cl1 A::m1{A::i0};
const Cl2 A::m2{A::i0, A::m1};
при этом коды
static const int i0=0;
static const Cl1 m1(i0); // ?
static const Cl2 m2(i0,M1); // ?
допустимы и в контексте функции и в контексте файла
Здравствуйте, watchmaker, Вы писали:
W>W>const Cl1 A::m1{A::i0};
W>
скобки круглые. А про последовательность инициализаций что нибудь гарантировано?
ЗЫ тоесть с++11 ничего нового в этом смысле не появилось.
Здравствуйте, Honduras, Вы писали:
Можно инлайн, если это constexpr
Если не constexpr, то придётся разнести объявление и определение
http://ideone.com/Zm1SUn
struct A {
int a_, b_;
constexpr A(int a): a_(a+a), b_(a*a) {}
};
struct B {
int a_, b_, c_;
constexpr B(int x, int y): a_(x+y), b_(x-y), c_(x*y) {}
};
struct R {
int r_;
R(int a, int b) : r_(a + rand()%(b-a)) {}
};
struct C {
static constexpr A a_ {3};
static constexpr B b_ {4,5};
static const R r_;
const R q_ {123,456}; // для нестатических членов можно и в рантайме всё делать
};
const R C::r_ {100,500};
Здравствуйте, Honduras, Вы писали:
H>Здравствуйте, watchmaker, Вы писали:
W>>W>>const Cl1 A::m1{A::i0};
W>>
H>скобки круглые.
В данном случае можно и круглые. Но и фигурные подходят.
H>А про последовательность инициализаций что нибудь гарантировано?
Да:
Static data members are initialized and destroyed exactly like non-local variables
H>ЗЫ тоесть с++11 ничего нового в этом смысле не появилось.
Появилось. Но у тебя в классах Cl1 и Cl2 есть нетривиальные конструкторы. Если бы их не было, или бы они были contstexpr, то можно было сразу по месту инициализацию написать. Например:
struct Cl1{ constexpr Cl1(int) {} };
struct Cl2{ int u; Cl1 v; };
struct A
{
static const int i0=0;
static constexpr Cl1 m1{i0};
static constexpr Cl2 m2{i0, m1};
};
constexpr Cl1 A::m1;
constexpr Cl2 A::m2;