Здравствуйте, landerhigh, Вы писали:
_>>Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции.
L>Если объявления X и Y переставить местами, то компилятор должен обидеться.
Не должен. В лучшем случае, ворнинг покажет. А в худшем молча скомпилирует в неопределённое поведение.
Здравствуйте, se_sss, Вы писали:
_>Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции. _>Можно так писать?
_>
_>class A
_>{
_> private:
_> X x;
_> Y y;
_> public:
_> class A ():
_> y(x) //У y внутри ссылка на x, которая данным вызовом будет прониициализирована
_> {}
_>};
_>
Писать так вполне можно: что переменная x, что переменная y создаются и уничтожаются вместе, ссылка на x будет валидна на протяжении всей жизни переменной y. Тут главное не забывать что инициализация переменных класса происходит в порядке их объявления в описании класса, удаление соответственно в обратном порядке.
Re[3]: Вопрос про список инициализации конструктора.
Здравствуйте, Centaur, Вы писали:
L>>Если объявления X и Y переставить местами, то компилятор должен обидеться.
C>Не должен. В лучшем случае, ворнинг покажет. А в худшем молча скомпилирует в неопределённое поведение.
Там будет ссылка на неинициализированную переменную. Может выругаться как боцман.
Здравствуйте, se_sss, Вы писали:
_>Компилятор не ругается, но у меня есть сомнения в правильности подобной конструкции. _>Можно так писать?
если убрать лишнее слово class, то можно
просто надо помнить о порядке инициализации мемберов класса. в вашем случае сначала будет создан x, затем его уже можно использовать при создании y
Re[2]: Вопрос про список инициализации конструктора.
Спасибо всем ответившим. Всё понятно.
Главное, в правильном порядке расположить объявления мемберов( а, кстати, не порядок в списке инициализации!!!).
Вроде, действительно ничего криминального.
Re[3]: Вопрос про список инициализации конструктора.
se_sss:
_>Главное, в правильном порядке расположить объявления мемберов( а, кстати, не порядок в списке инициализации!!!).
Если в рамках инициализации y ты только формируешь ссылку на x и не пытаешься через неё получить доступ к объекту, то от порядка объявления x и y корректность приведённой инициализации не зависит.
Re[4]: Вопрос про список инициализации конструктора.
Здравствуйте, Masterkent, Вы писали:
M>se_sss:
_>>Главное, в правильном порядке расположить объявления мемберов( а, кстати, не порядок в списке инициализации!!!).
M>Если в рамках инициализации y ты только формируешь ссылку на x и не пытаешься через неё получить доступ к объекту, то от порядка объявления x и y корректность приведённой инициализации не зависит.
С практической точки зрения согласен.
А вот с теоретической — не уверен. Объекта же ещё нет, т.е. и ссылку на него брать заранее как-то нехорошо.
Re[5]: Вопрос про список инициализации конструктора.
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]: Вопрос про список инициализации конструктора.
Здравствуйте, 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, Вы писали:
M>Для чего тут *&?
Для подавления варнинга
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Вопрос про список инициализации конструктора.
Здравствуйте, gegMOPO4, Вы писали:
MOP>Плохому учите.
Что не так? Это же просто баг в стандарте.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: Вопрос про список инициализации конструктора.
Здравствуйте, gegMOPO4, Вы писали:
E>>Что не так? Это же просто баг в стандарте.
MOP>Нехорошо использовать баги стандарта.
В смысле? Что занчит "использовать"? Это просто обход баги в стандарте...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском