Size: a a a

2020 April 02

PP

Pavel P in pro.cxx
Alexander Zaitsev
Vmime может быть
Вроде не оно, но спасибо!
источник

AP

Antony Polukhin in pro.cxx
А у нас инфограика по РГ21 появилась за 2019 год https://stdcpp.ru/news/rg21-za-2019
источник

CD

Constantine Drozdov in pro.cxx
Антон, а есть какие-то серьезные причины, почему нельзя считать классы, имеющие виртуальные методы, агрегатами?
источник

AP

Antony Polukhin in pro.cxx
Constantine Drozdov
Антон, а есть какие-то серьезные причины, почему нельзя считать классы, имеющие виртуальные методы, агрегатами?
А зачем?
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
А зачем?
Ну вот у меня есть иерархия визиторов, они все очень примитивные, но у них виртуальный метод Dispatch
Аналогично будет со всем, что наследует Serializable
источник

CD

Constantine Drozdov in pro.cxx
И пишу конструктор каждому классу просто потому, что язык требует
источник

AP

Antony Polukhin in pro.cxx
Лично меня очень выбешивает, что если есть наследование мы по прежнему можем считать класс агрегатом

Вот почему:
struct A{}:
struct B: A { int a; };

auto [a] = B{42}; // Скомпилируется?
std::get<0>(B{42}); // Вернёт int или A ?
источник

AP

Antony Polukhin in pro.cxx
Мне бы очень не хотелось, чтобы всё больше и больше классов считалось агрегатами
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Мне бы очень не хотелось, чтобы всё больше и больше классов считалось агрегатами
В моем случае достаточно, чтобы им разрешили инициализацию designator-ами
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Лично меня очень выбешивает, что если есть наследование мы по прежнему можем считать класс агрегатом

Вот почему:
struct A{}:
struct B: A { int a; };

auto [a] = B{42}; // Скомпилируется?
std::get<0>(B{42}); // Вернёт int или A ?
Вернет A, и я за бан синтаксиса B{42} (уже ногу таким стрелял), только { {}, 42 }
источник

AP

Antony Polukhin in pro.cxx
Constantine Drozdov
В моем случае достаточно, чтобы им разрешили инициализацию designator-ами
Усложним задачу:
auto [a] = B{42}; // Скомпилируется?
auto [a] = B{{}, 42}; // Скомпилируется?
auto [a,b] = B{42}; // Скомпилируется?
auto [a,b] = B{{}, 42}; // Скомпилируется?
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Усложним задачу:
auto [a] = B{42}; // Скомпилируется?
auto [a] = B{{}, 42}; // Скомпилируется?
auto [a,b] = B{42}; // Скомпилируется?
auto [a,b] = B{{}, 42}; // Скомпилируется?
Ну вот только 4, но по действующим правилам инициализация 3 корректна
источник

CD

Constantine Drozdov in pro.cxx
Продолжаю считать, что отмена обязательных {} в инициализаторах - чистая легаСИтина
источник

AP

Antony Polukhin in pro.cxx
Constantine Drozdov
Продолжаю считать, что отмена обязательных {} в инициализаторах - чистая легаСИтина
да, намудрили и внесли неоднозначностей
И вообще, в C++11 ещё накосячили, с initializer list и move семантикой
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
да, намудрили и внесли неоднозначностей
И вообще, в C++11 ещё накосячили, с initializer list и move семантикой
Комбинация из "можно не дописать" и "читаем последовательно" просто ужасна. Собственно, у меня в ногу было в упрощенном виде так:
struct A { int x = 0; int y = 0; };
struct B { int x = 0; int y = 0; };
struct C { A a; B b; int c; }; //всегда инициализируется
C{ {}, 0, 0 }; //имелось в виду C{ {}, {}, 0 };
источник

МВ

Макс Воробьев in pro.cxx
какой-то ад для понимания
источник

CD

Constantine Drozdov in pro.cxx
Макс Воробьев
какой-то ад для понимания
поверьте, там на самом деле было 8 полей и если бы я их по одному расписал, было бы еще хуже
там вся идея была в том, что reset полей структурки должен быть списан с инициализатора, тогда хотя бы не будет багов из-за недоreset
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Усложним задачу:
auto [a] = B{42}; // Скомпилируется?
auto [a] = B{{}, 42}; // Скомпилируется?
auto [a,b] = B{42}; // Скомпилируется?
auto [a,b] = B{{}, 42}; // Скомпилируется?
более того, если будет компилироваться только
 B { .a = 42 };

 B { .A = {}, .a = 42 };

то есть обязательно десигнаторы и обязательно указать все неинициализированное, кажется, все еще ок
источник

CD

Constantine Drozdov in pro.cxx
Antony Polukhin
Лично меня очень выбешивает, что если есть наследование мы по прежнему можем считать класс агрегатом

Вот почему:
struct A{}:
struct B: A { int a; };

auto [a] = B{42}; // Скомпилируется?
std::get<0>(B{42}); // Вернёт int или A ?
Хм... а я правильно понимаю, что единственно верный
auto [a] = B{{}, 42}; // Скомпилируется?

?
источник

CD

Constantine Drozdov in pro.cxx
источник