@ProCxx

Страница 983 из 2477
Berkus
20.06.2017
08:44:51
> All data types compatible with the C language (POD types) are trivially default-constructible.

Azoyan
20.06.2017
08:45:02
То есть не факт, что он будет нулём инициализирован?

Berkus
20.06.2017
08:46:33
A trivial default constructor is a constructor that performs no action. All data types compatible with the C language (POD types) are trivially default-constructible.

тривиальный дефолт конструктор не выполняет НИКАКИХ действий, у всех подов тривиальный дефолт конструктор

Google
Александр
20.06.2017
08:47:56
значит int i{}; ничего не инициализирует, ужас

побежал исправлять косяки с неинициализированными переменными

но писать можно
можно, но это ж UB?

Anatoly
20.06.2017
08:54:07
int n{} - это value initialization, будет ноль для скаляров

Александр
20.06.2017
08:57:01
то есть со скалярами всё ок, а вот уже struct B { int a; } B b{}; - не инициализируется?

Anatoly
20.06.2017
08:59:03
здесь будет aggregate-initialization, что обнулит a

Роман
20.06.2017
08:59:59
Потсоны девелоперы, киньте чятик по SQL или BI

С сегодняшнего дня ебать счастье прилетело

Александр
20.06.2017
09:00:52
Alexander
20.06.2017
09:02:08
А разве aggregate? Я когда разбирал как занулять такие структуры у меня получалось List-initialization=>value-initialization

Anatoly
20.06.2017
09:02:56
Aggregate initialization is a form of list-initialization, which initializes aggregates

Alexander
20.06.2017
09:10:05
Это в 11х? Я к чему, я вот разбирал этот кейс по 11ому стандарту и на слово Aggregate не натолкнулся

Google
Anatoly
20.06.2017
09:13:44
если строго по стандарту (С++14), то там нет такой терминологии

8.5.1 Aggregates [dcl.init.aggr] 1 An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3). 2 When an **aggregate** is initialized by an *initializer list*, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order.

просто взяли понятие aggregate и прилипили к нему initialization

ничего при этом с точки зрения стандарта не нарушая

Evgeniy
20.06.2017
09:17:45
A look at range-v3 code generation https://kristerw.blogspot.com/2017/06/a-look-at-range-v3-code-generation.html

Alexander
20.06.2017
09:25:48
Но в целом получается что дойти до zero-initialize можно без aggregate, особенно учитывая что "elements" для {} это как бы пусто

Anatoly
20.06.2017
09:26:48
дойти до zero initialization можно через initializer list

Alexander
20.06.2017
09:27:53
Во, я именно про это

Anatoly
20.06.2017
09:29:06
ну, я объяснил откуда эта терминология

раз есть агрегат, значит и есть и его инициализация

но это не термины стандарта

а так чисто разговорное

Alexander
20.06.2017
09:32:29
Ага. Я чисто для себя прояснить, не ошибся ли где когда цепочку от foo a{} до зануления в стандарте искал

Так-то все ок

Max
20.06.2017
10:50:46
кто знает, почему в std::string не добавляют format, join и другие вещи, которые есть в многих языках?

/dev
20.06.2017
10:51:47
И для любителей формата есть cstdio

Alexander
20.06.2017
10:53:29
используй буст. А вообще - ждём UCS

Max
20.06.2017
10:54:09
можете кинуть статью какую нибудь, я где-то видел раньше, но не могу найти, там было подробно описано все причины

Google
Alexander
20.06.2017
10:54:15
потому что это должно быть свободной функцией, и если вася пупкин напишет свой класс, он должен легко заюзать эту штуку и у себя

ждём, чтобы функции можно было вызывать через точку у обьектов

Berkus
20.06.2017
10:55:15
да, опен классы было бы огонь

Berkus
20.06.2017
10:55:31
для остального есть fmt

Alexander
20.06.2017
10:55:45
то есть?
ну UCS же, сам знаешь

Berkus
20.06.2017
10:55:46
то есть?
экстеншен классы в шарпе видел?

Alexander
20.06.2017
10:55:55
Berkus
20.06.2017
10:56:04
void foo(this Class); // => Class.foo()

в го примерно такая же фигня

Alexander
20.06.2017
10:56:21
void foo(this std::string s) {} std::string s; s.foo();

Alexander
20.06.2017
11:01:52
да-да, это очень кассная штука, потому что тогда начинает нормально рабоать автодополнение - покажет тебе сразу же, что ты можешь сделать с контенером. А это уже намного уменьшает входной порог для новых программистов и делает разработку на несколько шагов ближе к шарпу и джаве

Constantine
20.06.2017
11:02:27
почему линкер не может диагностировать нарушение odr?

Alexander
20.06.2017
11:04:33
чтобы ты мог юзать std::vector vec; vec.sort();

Antony
20.06.2017
11:08:07
почему линкер не может диагностировать нарушение odr?
Может, см -Wodr в https://gcc.gnu.org/gcc-5/changes.html

Google
/dev
20.06.2017
11:08:43
void foo(this std::string s) {} std::string s; s.foo();
А если у s уже есть метод foo?

Anatoly
20.06.2017
11:08:52
Может, см -Wodr в https://gcc.gnu.org/gcc-5/changes.html
Антон, а почему это делают опцией? Насколько замедляется процесс линковки?

Alexander
20.06.2017
11:09:15
А если у s уже есть метод foo?
а это пропозал читать надо

Antony
20.06.2017
11:11:25
приблизительно на memcmp для каждой дублирующейся сущности с weak linkage

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

Anatoly
20.06.2017
11:20:37
а по дефолту просто боятся эту опцию включать или что?

Berkus
20.06.2017
11:21:00
она может в плохих случаях линковку сломать

а по стандарту не требуется

Admin
ERROR: S client not available

Anatoly
20.06.2017
11:23:08
это понятно, что стандарт не требует, но сама по себе эта диагностика полезна для локализации детских болезней проекта

/dev
20.06.2017
11:28:05
это понятно, что стандарт не требует, но сама по себе эта диагностика полезна для локализации детских болезней проекта
Значит, ещё один полезный инструмент в сборке проекта. Одной кнопкой "збс" пока не обошлись

Constantine
20.06.2017
13:07:31
//a.h struct Around { struct B { explicit B(std::function<void()> f) : f(f) {}; std::function<void()> f; }; struct SomeStruct { SomeStruct(); B b; }; }; //a.cpp #include "a.h" Around::SomeStruct::SomeStruct() : b([]() {}) { } //b.cpp #include "a.h"

почему линкер вижака (14. ...) уверен, что это - ODR violation?

если указать nullptr вместо [](){}, то никаких проблем

Anatoly
20.06.2017
13:09:31
бага

Constantine
20.06.2017
13:09:57
голосую, что я не понимаю какой-то безумно тонкий момент

Anatoly
20.06.2017
13:11:11
едва ли

Constantine
20.06.2017
13:12:00
//a.cpp #include "a.h" std::function<void()> get_f() { return []() {}; } Around::SomeStruct::SomeStruct() : b(get_f()) { } все ок

Google
Constantine
20.06.2017
13:13:15
запускается link.exe [...] /ODR

User defined type 'Around::SomeStruct' has different definitions or layouts in the following modules:

Это warning из-за включенного /ODR

голосую, что я не понимаю какой-то безумно тонкий момент
Например, фишка в том, чем является лямбда в списке инициализации

Alex Фэils?︙
20.06.2017
13:23:12
В списке инициализации нету нпявных кастов

Constantine
20.06.2017
13:24:18
Это компилируется, если что

Constantine
20.06.2017
13:25:22
да, только ее использование синтезировало тип

Aidar
20.06.2017
13:28:25
возможно это чтото в кишках std function

Constantine
20.06.2017
13:29:49
указанная ошибка означает, что у типа Around::SomeStruct разные определения

а не у std::function

Constantine
20.06.2017
13:30:49
или есть?

Aidar
20.06.2017
13:31:13
где

все типы заранее известныничего не генерится

кроме очевидно кишков std function

Anatoly
20.06.2017
13:32:02
или есть?
это реализация конструктора

Constantine
20.06.2017
13:32:07
линкер утверждает, что вот эта строка модифицирует определение типа Around::SomeStruct Around::SomeStruct::SomeStruct() : b([]() {})

Anatoly
20.06.2017
13:32:26
это бага анализатора нарушения ODR

Constantine
20.06.2017
13:32:34
почему?

Aidar
20.06.2017
13:32:41
может и бага

Страница 983 из 2477