170 похожих чатов

То есть, в классе нельзя вызвать его же метод в

списке инициализации, верно?

59 ответов

5 просмотров

Только для инициализации других мемберов или хак с оператором запятая, но тоже при иниациализации

struct Foo { int init() { return 5;} int i; Foo() : i(init()) {} };

d7d1cd- Автор вопроса
Anatoly Shirokov
Только для инициализации других мемберов или хак с...

То есть, если метод класса меняет внутри себя поле этого же класса, то этот метод нельзя вызвать в списке инициализации конструктора этого класса?

d7d1cd
То есть, если метод класса меняет внутри себя поле...

Для вызова методов есть тело конструктора, зачем обязательно что-то сложное делать в списке инициализации?

Stas
struct Foo { int init() { return 5;} int i...

Как так получается, объект же не до конца сконструирован => почему метод init() работает?

heap
Как так получается, объект же не до конца сконстру...

Вызов методов в теле конструктора, ведь, не удивителен?

Stas
так делать плохо. но не запрещено

Так делать вполне нормально, пока метод не виртуальный

Dmitriy [Отпуск]
Так делать вполне нормально, пока метод не виртуал...

ну я стараюсь так не делать. были как-то баги при активном использовании функций мемберов в конструкторе. в идеале дефолтный конструктор должен быть пустым. благо С++ современный это позволяет

Dmitriy [Отпуск]
Так делать вполне нормально, пока метод не виртуал...

да и с виртуальным проблем не должно быть. vptr то в конструкторе инициализирован. просто не конечным значением иницализирован. но те, кто зовут виртуальные функции из конструкторов, понимают, что делают

Ofee Oficsu
Вызов методов в теле конструктора, ведь, не удивит...

и правда... меня, скорее, смутило то, что метод вызывался до фигурных скобок. У меня ошибочное представление о работе конструктора. Спасибо

Можно любую функцию, надо только использовать еë значение для инициализации

d7d1cd- Автор вопроса
Ilya Zviagin
Можно

Можно пример?

d7d1cd
Можно пример?

Тебе дали уже пример

Ilya Zviagin
Можно

А если поле не инициализировано?

d7d1cd- Автор вопроса
d7d1cd
Какой?

А для чего так кровь из носа нужно метод в списке инициализации именно вызывать?

d7d1cd- Автор вопроса
Слава
А для чего так кровь из носа нужно метод в списке ...

Причем здесь кровь из носа? Мне надо просто знать, можно так или нет.

d7d1cd
Причем здесь кровь из носа? Мне надо просто знать,...

Можно как угодно, но надо помнить, что уже сконструировано, а что еще нет

d7d1cd- Автор вопроса
Слава
И без этого нормально же жилось)

Можно было и плюсы не учить тогда. В с Си нормально жилось же )

d7d1cd
Можно было и плюсы не учить тогда. В с Си нормальн...

Ну тоже справедливо, но RAII не завезли

d7d1cd- Автор вопроса
Ilya Zviagin
Можно как угодно, но надо помнить, что уже сконстр...

Вот пример. В нем i инициализировано, но не компилится нихрена.

d7d1cd
Вот пример. В нем i инициализировано, но не компил...

А в блоке инициализации почему нельзя вызвать? Уже писали, что именно так нельзя

d7d1cd- Автор вопроса
Слава
А в блоке инициализации почему нельзя вызвать? Уже...

Я читал все, что писали. Но @MasterZiv говорит, что можно.

d7d1cd
Я читал все, что писали. Но @MasterZiv говорит, чт...

Можно в выражении с инициализацией нестатичного поле

d7d1cd- Автор вопроса
Ilya Zviagin
Можно, но надо думать, что будет.

Жесть какая-то. Вы объясните, почему код не компилится то?

d7d1cd
Я читал все, что писали. Но @MasterZiv говорит, чт...

в списке инициализации могут фигурировать только data members или конструкторы но в инициализаторах, которые в фигурных или круглых скобках, можно писать любые выражения. но нужно держать в уме состояние объекта, это да

d7d1cd- Автор вопроса
Vlad
в списке инициализации могут фигурировать только d...

Наконец-то нормальное объяснение. Благодарю!

d7d1cd
Вот пример. В нем i инициализировано, но не компил...

Список инициализации предназначен для инициализации полей, не для вызова методов, если очень хочется инициализировать поле вызовом метода, то или перемести вызов метода в тело конструктора, либо делай i(init(5))

d7d1cd
Жесть какая-то. Вы объясните, почему код не компил...

Потому что башкой не думаешь, у тебя метод void!

Vlad
в списке инициализации могут фигурировать только d...

Чего? Любое возможное выражение там может быть

d7d1cd- Автор вопроса
Ilya Zviagin
Потому что башкой не думаешь, у тебя метод void!

какая разница какой у меня метод? Вопрос был просто можно вызывать методы в списке инициализации или нет. Я не спрашивал можно ли инициализировать возвращаемым значением метода поля класса.

d7d1cd- Автор вопроса
Stas
Даже такое? Foo() : myMemberFunc() {} ?

Вернулись к моему изначальному примеру, лол...

d7d1cd- Автор вопроса
Ilya Zviagin
Такое нельзя

Как же так? Вы же говорили любое можно!

d7d1cd
Как же так? Вы же говорили любое можно!

В инициализаторе поля может использоваться любое выражение, валидное для инициализации поля этого типа, в том числе и вызов метода класса/структуры. Но вызов нестатичных мемберов в инициализаторе может привести к UB, за этим нужно следить

Daniokkk
В инициализаторе поля может использоваться любое в...

Вообще не знаю где это пригодится может

d7d1cd
Наконец-то нормальное объяснение. Благодарю!

что инициализировано, а что нет к моменту вычисления того или иного выражения в member initializer list можно почитать здесь: http://eel.is/c++draft/class.init#class.base.init-13.3

Ilya Zviagin
Чего? Любое возможное выражение там может быть

здравствуйте http://eel.is/c++draft/class.init#class.base.init-2.sentence-4

Vlad
здравствуйте http://eel.is/c++draft/class.init#cla...

Это описывает имя в списке инициализации. А чем его инициализировать - это любое выражение, дающее значение того типа, чей член мы инициализируем, или проводимого типа

Vlad
я же это и написал

Так это не означает что там нельзя вызвать функцию

Ilya Zviagin
Так это не означает что там нельзя вызвать функцию

>но в инициализаторах, которые в фигурных или круглых скобках, можно писать любые выражения где тут какие ограничения на вызов функций?

Vlad
>но в инициализаторах, которые в фигурных или круг...

Вы можете накидать в лямбду любой код, и не сообщить компилятору через клобберы, что именно вы туда накидали. Жестокая реальность такова, что при должной комбинации запретов и умалчивания компилятору ничего не останется, как бессильно плакать, глядя на вашу жестокость без права вмешаться

mezzo forte
Вы можете накидать в лямбду любой код, и не сообщи...

Не очень понял, что я только что прочитал. Вы можете показать пример?

mezzo forte
[](){asm volatile(".word 0xDEADBEEF");}

Хороший код. Не вижу повода для слёз

Stas
Хороший код. Не вижу повода для слёз

Плохой, если энкодинг соответствует, например, джампу, а мы не сказали, что это он

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта