Вопрос про список инициализации конструктора.
От: se_sss  
Дата: 18.08.11 14:36
Оценка:
Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции.
Можно так писать?

class A
{
  private:
   X x;
   Y y;

  public:
  class A ():
     y(x) //У y внутри ссылка на x, которая данным вызовом будет прониициализирована
  {}
};
Re: Вопрос про список инициализации конструктора.
От: landerhigh Пират  
Дата: 18.08.11 14:54
Оценка:
Здравствуйте, se_sss, Вы писали:

_>Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции.


Если объявления X и Y переставить местами, то компилятор должен обидеться.

_>Можно так писать?


data members defined in the class are initialized in the order in which they appear in the class declaration


Можно. Другое дело, что иногда так писать не стоит, но все от ситуации зависит.
www.blinnov.com
Re[2]: Вопрос про список инициализации конструктора.
От: Centaur Россия  
Дата: 18.08.11 14:58
Оценка:
Здравствуйте, landerhigh, Вы писали:

_>>Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции.


L>Если объявления X и Y переставить местами, то компилятор должен обидеться.


Не должен. В лучшем случае, ворнинг покажет. А в худшем молча скомпилирует в неопределённое поведение.
Re: Вопрос про список инициализации конструктора.
От: _niko_ Россия  
Дата: 18.08.11 15:03
Оценка:
Здравствуйте, se_sss, Вы писали:

_>Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции.

_>Можно так писать?

_>
_>class A
_>{
_>  private:
_>   X x;
_>   Y y;

_>  public:
_>  class A ():
_>     y(x) //У y внутри ссылка на x, которая данным вызовом будет прониициализирована
_>  {}
_>};
_>


Писать так вполне можно: что переменная x, что переменная y создаются и уничтожаются вместе, ссылка на x будет валидна на протяжении всей жизни переменной y. Тут главное не забывать что инициализация переменных класса происходит в порядке их объявления в описании класса, удаление соответственно в обратном порядке.
Re[3]: Вопрос про список инициализации конструктора.
От: landerhigh Пират  
Дата: 18.08.11 15:21
Оценка:
Здравствуйте, Centaur, Вы писали:

L>>Если объявления X и Y переставить местами, то компилятор должен обидеться.


C>Не должен. В лучшем случае, ворнинг покажет. А в худшем молча скомпилирует в неопределённое поведение.


Там будет ссылка на неинициализированную переменную. Может выругаться как боцман.
www.blinnov.com
Re: Вопрос про список инициализации конструктора.
От: uzhas Ниоткуда  
Дата: 18.08.11 15:26
Оценка:
Здравствуйте, se_sss, Вы писали:

_>Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции.

_>Можно так писать?

если убрать лишнее слово class, то можно
просто надо помнить о порядке инициализации мемберов класса. в вашем случае сначала будет создан x, затем его уже можно использовать при создании y
Re[2]: Вопрос про список инициализации конструктора.
От: se_sss  
Дата: 18.08.11 15:36
Оценка:
Спасибо всем ответившим. Всё понятно.
Главное, в правильном порядке расположить объявления мемберов( а, кстати, не порядок в списке инициализации!!!).
Вроде, действительно ничего криминального.
Re[3]: Вопрос про список инициализации конструктора.
От: Masterkent  
Дата: 18.08.11 15:47
Оценка: +1
se_sss:

_>Главное, в правильном порядке расположить объявления мемберов( а, кстати, не порядок в списке инициализации!!!).


Если в рамках инициализации y ты только формируешь ссылку на x и не пытаешься через неё получить доступ к объекту, то от порядка объявления x и y корректность приведённой инициализации не зависит.
Re[4]: Вопрос про список инициализации конструктора.
От: se_sss  
Дата: 19.08.11 08:59
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>se_sss:


_>>Главное, в правильном порядке расположить объявления мемберов( а, кстати, не порядок в списке инициализации!!!).


M>Если в рамках инициализации y ты только формируешь ссылку на x и не пытаешься через неё получить доступ к объекту, то от порядка объявления x и y корректность приведённой инициализации не зависит.


С практической точки зрения согласен.
А вот с теоретической — не уверен. Объекта же ещё нет, т.е. и ссылку на него брать заранее как-то нехорошо.
Re[5]: Вопрос про список инициализации конструктора.
От: Masterkent  
Дата: 19.08.11 10:37
Оценка: 10 (1) +1
se_sss:

M>>Если в рамках инициализации y ты только формируешь ссылку на x и не пытаешься через неё получить доступ к объекту, то от порядка объявления x и y корректность приведённой инициализации не зависит.


_>С практической точки зрения согласен.

_>А вот с теоретической — не уверен.

В теории "A reference shall be initialized to refer to a valid object or function", однако ж определение понятия "valid object" в стандарте отсутствует, так что никому до этого ограничения нет дела. Данную формулировку давно уже собираются убрать (см. issue 453), но всё никак не уберут из-за того, что рассмотрению этой проблемы отведён самый низкий приоритет.

_>Объекта же ещё нет, т.е. и ссылку на него брать заранее как-то нехорошо.


Формировать указатель на него можно совершенно легально. Запрещать то же самое для ссылок нет никаких оснований.
Re[6]: Вопрос про список инициализации конструктора.
От: Erop Россия  
Дата: 19.08.11 11:54
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>Формировать указатель на него можно совершенно легально. Запрещать то же самое для ссылок нет никаких оснований.


О! Я что-то я раньше не думал про это в таком ключе, и всегда юзал указатели просто!
А ведь уже сейчас можно обойти эту хреновину через *&
struct B { int b; };
struct A { 
    A( B& rB ) : b(rB.b) {}

    int& b;
};

class C {
    A a;
    B b;
    C() : a( *&b ) {}
};
Компилируется и работает!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Вопрос про список инициализации конструктора.
От: Masterkent  
Дата: 19.08.11 13:00
Оценка:
Erop:

E>А ведь уже сейчас можно обойти эту хреновину через *&


Для чего тут *&?
Re[8]: Вопрос про список инициализации конструктора.
От: Erop Россия  
Дата: 20.08.11 19:05
Оценка: 5 (1)
Здравствуйте, Masterkent, Вы писали:

M>Для чего тут *&?


Для подавления варнинга
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Вопрос про список инициализации конструктора.
От: gegMOPO4  
Дата: 21.08.11 08:11
Оценка: -2
Здравствуйте, Erop, Вы писали:
E>Для подавления варнинга

Плохому учите.
Re[10]: Вопрос про список инициализации конструктора.
От: Erop Россия  
Дата: 22.08.11 03:29
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

MOP>Плохому учите.

Что не так? Это же просто баг в стандарте.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: Вопрос про список инициализации конструктора.
От: gegMOPO4  
Дата: 22.08.11 13:06
Оценка:
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gegMOPO4, Вы писали:
MOP>>Плохому учите.
E>Что не так? Это же просто баг в стандарте.

Нехорошо использовать баги стандарта.
Re[12]: Вопрос про список инициализации конструктора.
От: Erop Россия  
Дата: 23.08.11 11:19
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

E>>Что не так? Это же просто баг в стандарте.


MOP>Нехорошо использовать баги стандарта.


В смысле? Что занчит "использовать"? Это просто обход баги в стандарте...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.