Size: a a a

2020 November 09

АР

Андрей Руссков... in pro.cxx
потому что для некоторых API реально лучше не придумаешь
источник

АК

Александр Караев... in pro.cxx
Андрей Руссков
хм. Просто раньше я думал что можно сделать что-то типа

struct S { .... };
void foo(S s);
foo({.a = 15, .x = 4, .b = "foo"});
так делай, просто порядок a, x и b сохраняй
источник

АК

Александр Караев... in pro.cxx
пропускать поля никто не запрещает
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Андрей Руссков
я думал их задача собственно и была решить проблему "инициализировать надо в прямом порядке"
Чему я и удивляюсь. Ну и это несовместимость с обычным си
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Александр Караев
это не проблема, а требование (следствие порядка вызова деструкторов), которое все вечно любили нарушать, инициализируя поля в конструкторе абы как (получая варнинги, в крайнем случае).
хоть с designated initializers не накосячили - сразу запретили
Причем тут деструкторы?
источник

АК

Александр Караев... in pro.cxx
Vyacheslav Olkhovchenkov
Причем тут деструкторы?
отвечу вопросом на вопрос - почему инициализаторы полей в конструкторе класса всегда вызываются в порядке объявления полей в классе, а не в порядке, прописанном руками в инициализации?
источник

АР

Андрей Руссков... in pro.cxx
Vyacheslav Olkhovchenkov
Чему я и удивляюсь. Ну и это несовместимость с обычным си
ну в си в принципе нет нетривиальных полей, поэтому там порядок примерно по барабану
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Что то я с утра вопроса не понял. У нас есть конструктор, в нем код. в этом коде поля и инициализируются
источник

АР

Андрей Руссков... in pro.cxx
кроме конечно явных спецэффектов
источник

АР

Андрей Руссков... in pro.cxx
типа {.x = i++, .y = i++}
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Ну и тут могли бы для тривиальных как минимум разрешить
источник

ПК

Побитый Кирпич... in pro.cxx
Vyacheslav Olkhovchenkov
Что то я с утра вопроса не понял. У нас есть конструктор, в нем код. в этом коде поля и инициализируются
Но поля в конструкторе инициализируются не в том порядке что ты написал, а а порядке объявления в классе
источник

ПК

Побитый Кирпич... in pro.cxx
И при проёбе порядка ты не получаешь ошибку компиляции (баг стандарта, я считаю). Поэтому можно минусануть себе ногу легко. С designated тут понадежнее
источник

ПК

Побитый Кирпич... in pro.cxx
Vyacheslav Olkhovchenkov
Ну и тут могли бы для тривиальных как минимум разрешить
Лучше одно правило для всех, ато ещё разбираться каждый раз кто тут тривиальный
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Побитый Кирпич
Но поля в конструкторе инициализируются не в том порядке что ты написал, а а порядке объявления в классе
Про какой порядок речь? В каком случае?
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Ну офысетофф значит можно а тут нельзя?
источник

АК

Александр Караев... in pro.cxx
Vyacheslav Olkhovchenkov
Про какой порядок речь? В каком случае?
struct A {
 int x, y;

 A() : y(1), x(y) {}
};
источник

EP

Evgen Pervenenko in pro.cxx
всем привет подскажите плз
class B : public class A{
void foo() override{
   this->A::foo();
   std::invoke(&A::foo, this);
}
};

std::invoke уходит в рекурсию, почему this->A::foo() отрабатывает норм?
источник

VO

Vyacheslav Olkhovche... in pro.cxx
Ну тут не задумывался, не знал даже. Они решили это же на десигнатес натянуть?
источник

АК

Александр Караев... in pro.cxx
Evgen Pervenenko
всем привет подскажите плз
class B : public class A{
void foo() override{
   this->A::foo();
   std::invoke(&A::foo, this);
}
};

std::invoke уходит в рекурсию, почему this->A::foo() отрабатывает норм?
вызов по указателю на мембер-функцию получается виртуальным.
можно упростить до:
this->A::foo() - вызовется A::foo
(this->*&A::foo)() - вызовется foo, как виртуальная
источник