
Dark
03.03.2018
13:59:12
Аа, понял

Evgeny
03.03.2018
14:01:37
В целом если замыканий нет, то this.outer равен null, то есть компилятор достаточно умен. чтобы не захватывать контекст
но накой он вообще создает поле this.outer?
впрочем это такой мелкий оверхед, что можно не парится, но лучше static вставить

Google

Dark
03.03.2018
14:04:16
Одним полем меньше?

Evgeny
03.03.2018
14:07:53
ага, ну и защита от ошибки. мало ли случайно замыкание сделаешь :)

Dark
03.03.2018
14:08:32
Короткое замыкание причем

Evgeny
03.03.2018
14:12:57
аж искрит

Xessao
03.03.2018
14:29:09
ага, эдакий костыль
Это не костыль, далеко не костыль. Дружественные функции, к примеру, довольно полезны при перегрузки бинарных операций (<<, >>, +, -, etc.) и при написании юнит-тестов. Если примеров мало, то другие можешь посмотреть в книге Бьёрна Страуструпа "Язык программирования С++".

Evgeny
03.03.2018
14:29:42
местами без них трудно
но по сути это костыль, которого удачно избежали в D
реальные костыли тоже очень полезны... для инвалидов. но лучше все же когда они не нужны, верно?

Xessao
03.03.2018
14:32:59
Давай мы не будем устраивать холивар на эту тему, хорошо?

Evgeny
03.03.2018
14:34:04
костыли полезны почти всегда
Меня сначала обескуражила иная система приватности после перехода с плюсов на D. Но стоило немного подумать и стало очевидно, что так намного лучше. Наконец-то никаких дебильных френд-функций

Google

Evgeny
03.03.2018
14:37:11
Кстати, "Язык программирования С++" сильно устарела. Я по ней учил C++ на первом курсе, в 1995 году
По мне так Страуструп ваще не авторитет

Dark
03.03.2018
14:48:04
Не, он авторитет. В С++. А у нас тут D, так что тут он не авторитет
Но вообще, соглашусь с Eugene: костыльность это одно, а полезность это другое. И это даже не взаимоисключающие понятия

Evgeny
03.03.2018
14:53:59

Dark
03.03.2018
14:55:15

Evgeny
03.03.2018
15:18:20
Для меня особо авторитетов нет, я стараюсь сам анализировать инфу. В C++ прислушиваюсь к Саттеру и Мейерсу, немножко к Александреску.
Страуструпа уважаю как создателя C++, но его взгляды на развитие C++ мне представляются несколько старперскими.
например, он зарезал static if
но это мой личный взгляд, я никому его не навязываю.

Dark
03.03.2018
17:34:33

Valeriy
03.03.2018
17:52:18

Eto
03.03.2018
17:58:54

Igor
03.03.2018
18:00:18
возможно тут работает логика что .init и дефолтный конструктор должны иметь одно и то-же поведение и следовательно достаточно .init

Valeriy
03.03.2018
18:00:28
Вот тут нашёл решение:
https://forum.dlang.org/post/ealzckbomansfskupdoj@forum.dlang.org
предлагают создать класс и разместить его на стеке. С помощью шаблона scoped

Eto
03.03.2018
18:05:42

Google

Eto
03.03.2018
18:05:55

Pavel
03.03.2018
18:10:18
Так можно же при объявлении структуры проинициализировать ее поля
S mystruct = {a:6}

Valeriy
03.03.2018
18:11:05
У меня где то в коде на С или С++ есть функции для создания/удаления и манипулирования объектом.
я хочу их обернуть в коде на D вот так
private extern (C)
{
void * make_a();
void del_a(void *a);
void a_meth(void *a);
}
struct A
{
private:
void *_ptr;
public:
this() {
_ptr = make_a();
}
~this() {
del_a(_ptr);
}
void meth()
{
_ptr.a_meth();
}
}
Вот так не скомпилится:
struct A
{
void *_ptr = make_a();
...
}

Eto
03.03.2018
18:14:31
init() добавить.

Valeriy
03.03.2018
18:14:32
А из-за этого странного ограничения я вынужден делать так:
private class A
{
private:
void *_ptr;
public:
this() {
_ptr = make_a();
}
~this() {
del_a(_ptr);
}
void meth()
{
_ptr.a_meth();
}
}
public alias DA = scoped!A;

Eto
03.03.2018
18:15:31
Это один из тех случаев, когда приходя в новый язык, люди приносят с собой свои старые подходы.

Valeriy
03.03.2018
18:16:43

Eto
03.03.2018
18:17:10

Valeriy
03.03.2018
18:17:58
Засоряет клиентский код.

Dark
03.03.2018
18:18:01
А scoped что делает?

Valeriy
03.03.2018
18:18:18

Pavel
03.03.2018
18:18:25
Да я помню мне как то это понадобилось. Но вроде я легко обошел.

Valeriy
03.03.2018
18:18:42

Pavel
03.03.2018
18:19:45
Уже забыл :) но, вроде я что то типа фабрики сделал
Функция которая возвращает подготовленную структуру

Google

Valeriy
03.03.2018
18:20:15

Eto
03.03.2018
18:20:59

Dark
03.03.2018
18:22:04

Valeriy
03.03.2018
18:22:33
Это всё субъективно. Вы гонитесь за тем, что.. важно ли?
Люблю когда в клиентском коде все прозрачно и предсказуемо.
А init() — это дополнительные соглашения.
Объекты моей структуры надо создавать не как обычно, а через статическую функцию. Код загрязняется.
Можно так делать, но не элегантно.

Dark
03.03.2018
18:24:10
Аллоцировать класс на стеке может быть небезопастно, не?
О, начали сворачивать внутри std в доках. Удобнее стало

Valeriy
03.03.2018
18:25:12

Dark
03.03.2018
18:26:07

Valeriy
03.03.2018
18:26:31

Eto
03.03.2018
18:26:33

Dark
03.03.2018
18:26:35
Лично я бы сделал выбор в лишнее соглашение, чем рисковал бы вылетами
О, 2.079 вышла
Интересно, где можно прочитать чейнджлог?

Maxim
03.03.2018
18:31:08
https://dlang.org/changelog/2.079.0.html

Valeriy
03.03.2018
18:33:14

Maxim
03.03.2018
18:33:36
о, @nogc исключения подвезли, отлично)

Igor
03.03.2018
18:35:15
круто!

Dark
03.03.2018
18:35:23
Я привык искать чейнджлог на гитхабе :D

Google

Eto
03.03.2018
18:43:56

Dark
03.03.2018
18:44:59
Меньше времени где? В разработке или в рантайме?

Evgeny
03.03.2018
18:47:41
В C++ классы могут быть PODами, а могут и не быть. В D структуры - это всегда POD-ы, поэтому они не могут иметь нетривиальных конструкторов по умолчанию и конструкторов копирования.
а также виртуальных методов.
Компилятор может перемещать (move) структуры тупым memcpy не вызывая вообще никаких методов.

Dark
03.03.2018
18:53:40
В С++ и структуры POD'ы

Evgeny
03.03.2018
18:54:38
В С++ и структуры POD'ы
Нет.
В C++ структуры - это классы с видимостью членов по умолчанию public. больше они ничем от классов не отличаются.

Dark
03.03.2018
18:55:26
Т.е. они могут содержать методы?
О.о
Получается, что да
Кажется я больше писал на С, чем на С++
Даже не знаю, радоваться или грустить

Evgeny
03.03.2018
18:58:04

Dark
03.03.2018
18:58:23
Нда
В чем смысл структуры тогда

Evgeny
03.03.2018
18:59:08

Dark
03.03.2018
19:00:43
Я всю свою жизнь жил в неведении

Evgeny
03.03.2018
19:01:10
бывает
многие ли из вас знают, что в D можно вот так делать?
https://glot.io/snippets/eyty1bffd6

Pavel
03.03.2018
19:04:21
В мануале про структуры D есть сравнительнач таблица т про c++ тоже