
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{}; ничего не инициализирует, ужас
побежал исправлять косяки с неинициализированными переменными

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
да, опен классы было бы огонь

Evgeniy
20.06.2017
10:55:28

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

Alexander
20.06.2017
10:55:45

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();

Evgeniy
20.06.2017
11:00:13

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

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

Evgeniy
20.06.2017
11:04:11

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

Evgeniy
20.06.2017
11:05:12

Antony
20.06.2017
11:08:07

Google

/dev
20.06.2017
11:08:43

Anatoly
20.06.2017
11:08:52

Alexander
20.06.2017
11:09:15

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

Berkus
20.06.2017
11:39:28

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

Stanislav
20.06.2017
13:12:42

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
Это компилируется, если что

Aidar
20.06.2017
13:24:53

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

Aidar
20.06.2017
13:30:33

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
может и бага