инициализация константных членов?
От: Honduras  
Дата: 27.02.15 13:01
Оценка:
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 декларацией функции. Мне нужны инициализированные члены данные. Как?
Re: инициализация константных членов?
От: watchmaker  
Дата: 27.02.15 13:18
Оценка:
Здравствуйте, 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};
Re: инициализация константных членов?
От: Honduras  
Дата: 27.02.15 13:18
Оценка:
при этом коды
 static const int i0=0;
   static const Cl1 m1(i0); // ?
   static const Cl2 m2(i0,M1); // ?


допустимы и в контексте функции и в контексте файла
Re[2]: инициализация константных членов?
От: Honduras  
Дата: 27.02.15 13:28
Оценка:
Здравствуйте, watchmaker, Вы писали:
W>
W>const Cl1 A::m1{A::i0};
W>


скобки круглые. А про последовательность инициализаций что нибудь гарантировано?


ЗЫ тоесть с++11 ничего нового в этом смысле не появилось.
Отредактировано 27.02.2015 13:30 Honduras . Предыдущая версия .
Re: инициализация константных членов?
От: Кодт Россия  
Дата: 27.02.15 13:31
Оценка:
Здравствуйте, 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};
Перекуём баги на фичи!
Re[3]: инициализация константных членов?
От: watchmaker  
Дата: 27.02.15 13:43
Оценка: 1 (1)
Здравствуйте, 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;
Отредактировано 27.02.2015 15:41 watchmaker . Предыдущая версия . Еще …
Отредактировано 27.02.2015 13:52 watchmaker . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.