LINUX.ORG.RU

Facebook платит за устранение багов в реализации языка программирования D

 ,


1

5

На данный момент размер вознаграждения за исправление багов в общей сложности насчитывает 1500$. Со слов Александреску, они будут внимательно смотреть, как это скажется на сообществе.

Одно из определений языка D: «D — это то, чем должен был быть С++». Вокруг языка сломалось уже много копий, но несмотря на это язык продолжает жить и развиваться, демонстрируя свои замечательные возможности и расширяя свое сообщество. Все больше разработчиков из мира С++/Java пристально следят за развитием языка и стараются держать руку на пульсе. Должен отметить, что сообщество D не является ортодоксальным и фундаменталистким (что бы это ни значило), и нередко в ньюсгруппах можно увидеть, что в ответ на вопрос, можно ли использовать D для решения определенной задачи, члены сообщества рекомендуют задавшему вопрос использовать другой язык, отличный от D. Так что в лице сообщества D любой найдет грамотных специалистов своего дела, готовых ответить на нужный вопрос кратко и по существу. Все это делает развитие языка неизбежным и неотвратимым.

Список багов с ценами за их устранение

>>> Оригинал новости

Ответ на: комментарий от anonymous

с другой стороны у single source есть свои прелести, но на этот случай можно и грамотное программирование осилить :))

Да, при быстром прототипировании D-шный unittest очень привлекательная штука. Сам ей пользовался.

Но не масштабируется. Как только переходишь от прототипа к чему-то большему, нужно переходить на другой инструмент.

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

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Но я выше по треду уже говорил о том, что иногда для тестирования нужно городить специальные стенды/имитаторы. Для того, чтобы иметь возможность проверять работоспособность кода при определенном распределении событий во времени. Держать код таких имитаторов прямо внутри основного кода для того, чтобы инструкции unittest работали — вот это мне кажется сомнительной идеей.

unittest сделаны не для этого, ИМХО, разумеется.

anonymous ()
Ответ на: комментарий от tailgunner

И языковая поддержка unit-тестирования мешает этому... как именно?

Боюсь, ты не того человека спрашиваешь.

Мой пойнт таков: если unittest-ы лежат прямо в коде либы, то размер либы может сильно увеличиваться, что есть плохо. Так же плохо то, что при компиляции в release режиме код unittest-ов выбрасывается. Поэтому ты не можешь быстро проверить, проходят ли unit-тесты в release-режиме.

Если держать unit-тесты отдельно, то нет ни увеличения объема либы, ни проблем с прогоном тестов в release-режиме.

eao197 ★★★★★ ()
Ответ на: комментарий от anonymous

плохое, негодное протоколирование. Берёшь цифровой осциллограф, например Novena ноутбук с FPGA, пишешь логгер, и пускай себе в фоне парсит протокол куда-то в лог.

Я собственно об этом и говорил. Хотя даже тут есть нюансы.

anonymous ()
Ответ на: комментарий от anonymous

unittest сделаны не для этого, ИМХО, разумеется.

А для чего?

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Мой пойнт таков: если unittest-ы лежат прямо в коде либы, то размер либы может сильно увеличиваться, что есть плохо

Мой пойнт в том, что когда встроенные unit-тесты «не масштабируются» - пора переходить на другой уровень тестирования (который является уже интеграционным или еще каким-то тестированием).

tailgunner ★★★★★ ()
Ответ на: комментарий от anonymous

есть ли какие-то планы по реализации аннотаций ?

DIP6 это ранние спекуляции на тему User-Defined Attributes, которые были добавлены в язык около года назад:

http://dlang.org/attribute.html#uda

Dicebot ()
Ответ на: комментарий от anonymous

Что такое «нормальный язык»? И почему C++ пользуются, а CL не очень?

anonymous ()
Ответ на: комментарий от anonymous

В нормальном языке

Языки скорее делятся на полезные и нет, чем на «нормальные» и «ненормальные».

В крестах смешались в кучу ...

В крестах понятие единицы трансляции ортогонально как инклудам, так и пространствам имен.

forCe ()

Кто-нибудь может мне внятно объяснить, как ref влияет на тип?

ref int foo(ref int x)
{
	return x;
}

typeof(foo) выдает ref int(ref int x).

int[] a = [1,2,3,4,5];
foreach(ref int e; a)
    ...

typeof(e) выдает int, без ref.

На объявление в духе

int x;
ref int y = x;
Говорит, что ref может стоять только в функциях и в foreach.

Однако, дает сделать alias

alias ref int ref_int;
Но он работает как-то странно:
int x;
ref_int y = x;
y = 100500
y == 100500, а x == 0.

При этом typeof(y) выдает int.

Более того, с таким alias'ом даже foreach лажает

alias ref int ref_int;
int[] a = [1,2,3,4,5];
foreach(ref_int e; a) {
    e = 100500;
}

Оставляет массив без изменений.

Я совсем запутался. И я пока не вижу оснований соглашаться с тем, что D проще C++.

forCe ()
Ответ на: комментарий от anonymous

Идиотизм какой-то

Это не идиотизм. ref означает передачу по ссылке, в результате изменения будут доступны в запускающем коде. ref не является отдельным идентификатором общего пользования, как и inout.

Vudod ★★★★★ ()
Ответ на: комментарий от Vudod

Тогда почему разрешен alias. И почему, если он разрешен, он не работает?

anonymous ()
Ответ на: комментарий от forCe

ref это как var в Паскале в процедурах и функциях. За его пределами у него нет смысла. Ещё есть ref функции, там смысл немного другой.

Vudod ★★★★★ ()
Ответ на: комментарий от anonymous

Тогда почему разрешен alias. И почему, если он разрешен, он не работает?

Не знаю, возможно это либо какой-то костыль, уже не нужный, либо, напротив, задел. Не исключено также, что это просто недоработка.

Vudod ★★★★★ ()
Ответ на: комментарий от anonymous

Что такое «нормальный язык»?

язык — это в первую очередь, инструмент для выражения мыслей.
нормальный язык — это такой, который позволяет адекватно эти мысли выражать.
адекватно не языку, исторически сложившемуся ранее; и даже не каким-то нормам культуры или какой-то там морали. это всё вторично.

а ситуации, сообщению, решению — тому, что он призван выражать
если язык неадекватен — его надо менять. в самом простом случае — расширять
потому что язык — это живое, и у языка есть аффтар — это ты сам, любой и каждый участнег

язык подстраивается под ситуацию и под то, что нужно выразить: он как вода, принимает форму сосуда. у него нет какой-то отдельной самоцели. у него нет стабильной формы. язык-оболочка это лишь исторически сложившийся почему-то именно вот так паттерн, шаблон, который он наполняет новым смыслом, содержанием, пытаясь выразить новый метаязык, новое понятие.

это просто среда, посредник, medium. и medium is not just a message, it's little more than this.

medium это контекст для метациклического вычислителя этого сообщения, которое вычисляет каждый участнег — и немного по своему.

каждый участнег — такой метациклический вычислитель

знакомься, именно это и есть язык — та конструкция в голове, которая разворачивается у тебя в голове, участнег, читая эти строки.

как пример, есть языки более гибкие и адекватные, или менее  — конкретной ситуации. например, синтетические и аналитические.

проще придумать новое слово: «штангенциркуль» из двух составных, чем изобретать «круговую палку», «снегоходы» и «мокроступы». или, как в языке индейцев навахо называли самолёт-бомбардировщик: большая железная птица, бросающая взрывающиеся яйца, потому что язык был просто недостаточно гибок — не позволял конструировать ad-hoc, по ситуации новые слова и понятия.

что означает, что если язык не адекватен — надо взять другой.

если он не нормален — надо его сначала попробовать расширить. а потом уже выкинуть.

И почему C++ пользуются, а CL не очень?

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

некоторые языки мимикрируют под язык-оболочку, и интуитивно понятны по аналогии, но эта интуитивность — кажущаяся обманка.
некоторым пофиг на интуитивность, и сразу это показывают. даже формой.

в итоге у разных участнегов складывается разное представление об удобстве, эргономичности, интуитивной когнитивности.
но это представление ложное — ведь суть не в языке-оболочке, а в том самом метаязыке, который и призван выражать эту самую суть.

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

потому что смысл надо осиливать, а это — отдельная работа.

которую лень делать.

потому что 95% и всё такое..

anonymous ()
Ответ на: комментарий от tailgunner

по дискуссии на тему «встроенные ли должны быть тесты» — во всяком случае, инварианты и постусловия точно должны быть встроенные (а заодно и предусловия); иногда они маппятся 1 к 1 на тесты, но отнюдь не всегда

пример использования видимо тоже должен быть встроенным (а это практически готовый тест)

www_linux_org_ru ★★★★★ ()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от Dicebot

а почему кстати нет ref как языковой сущности, а только параметр функций?

и да, я все время хотел сказать, и все откладывал из-за более интересных вопросов в треде, так вот — лучше бы они 1500 баксов потратили на написание нормальной документации и design rationale, чтобы вот таких вот сомнений насчет «это такие странные правила, или может баг» у перебезчиков с с++ не возникало :-)

www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от Vudod

а вот мощности батареек если и будут расти, то очень-очень медленно

Производительность на ватт растёт также, если что.

есть мнение, что она растет *исключительно* за счет техпроцесса (35 нм, например), который улучшаться будет очень медленно,

и совершенно не растет за счет ухищрений в архитектуре процессора — а наоборот, *падает* — не зря в атоме выкинули предсказатель перехода или спекулятивное выполнение перехода (не помню уже)

www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от Dicebot

C++ тоже не предоставляет многих важных и нужных средств языка и ничем в этом смысле не выделяется. Разница лишь в том, что разработчик, привыкший к C++, считает это набором «минимальным обязательным», хотя никаких объективных предпосылок к этому нет.

наличие бесплатных компиляторов с открытыми исходниками и довольно приличным качеством, реализующих это «минимально обязательное», может считаться объективной предпосылкой?

www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от eao197

Проблема же с этим подходом в том, что после определенного момента развития DSL возможностей хост-языка уже не хватает для нормального выражения новых требований к хост-языку.

и получаем 2-й пункт: хороший язык должен быть спроектирован так, чтобы быть отличным eDSL контейнером (т.е. хостом для eDSL)

(1-й, как мы помним — это одновременно стабильность и возможность развития; 2-й пункт представляет собой практический способ реализации 1-го пункта)

из языков, явно поставивших задачу п.2, мне известна только jetbrains mps, но у нее свои заморочки; с точки зрения п.2 с++ и d, похоже, находятся на близких уровнях (хотя у d возможностей больше из-за интроспекции/рефлексии)

www_linux_org_ru ★★★★★ ()
Последнее исправление: www_linux_org_ru (всего исправлений: 2)
Ответ на: комментарий от eao197

Можно посмотреть на то, во что со временем превратился C#, первая версия которого не имела даже генериков.

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

www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от Dicebot

RESTful принципами. Например такая вещь, как параметр «action» - дичайшее их нарушение.

почему?

www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от Vudod

* Преимущество разделяемых данных при обмене между потоками мнимое, поскольку современные процессоры имеют большой раздельный кеш для каждого ядра. Поэтому будем копировать данные между потоками. Отсюда, в частности, immutable.

вот эта часть с immutable, pure, с натяжкой может быть признана исследовательской частью языка (с натяжкой — т.к. результаты исследования пишет eao193 здесь, а не сами исследователи)

плюс к этому исследование на уровне детского сада — общего эффект полиморфизма нет, есть только частные случаи

но да, изучать то, что они там делают — *определенно* имеет смысл ради интересных идей

* Явная работа с указателями есть зло всегда, кроме особо системных случаев. Поэтому синтаксис должен быть построен так, чтобы обычный несистемный программист указателей не видел.

как показал опыт явы, слабые ссылки *нужны* в обычном прикладном программировании (другое дело, что синтаксис gc ссылок может быть короче и удобнее, чем ссылкок других типов)

* Шаблоны должны быть простыми и понятными, иначе ими никто не станет пользоваться, кроме некоторых любителей и сильно матёрых гуру. Но этих людей мало. Если же многие не станут пользоваться шаблонами, будет свалка.

ну да, это заусенцы с++, убранные напильником

* У большинства базовых вариантов: массивов, ассоциативных массивов (словарей), кортежей, строк и прочих комплексных чисел должна быть одна стандартная реализация. Её отсутствие или недостаточная проработанность ведёт к зоопарку (что мы уже видели даже на примере самого D1 с двумя «стандартными» библиотеками).

ммм... а разве не у *Д2* 2 стандарнтых библиотеки?

* Сборщик мусора должен быть и должен быть включён по умолчанию. Если вы такой джедай, что он вам не нужен, вы его выключаете и работаете, как хотите. При этом на вас смотрят либо как на прокажённого, либо как на святого (иногда эти понятия пересекаются). Потому что иначе память будет течь (все мы грешны). Это не значит, что сборщик мусора не может ошибаться, но исправить 1 сборщик мусора всегда проще/лучше, чем править 100500 написанных без него программ.

сборщик мусора должен быть (но без слабых ссылок память все равно будет течь и с ним)

* unittest должны быть встроены в те модули, где написан сам тестируемый код, иначе они теряются и на них все забивают. Их включение/исключение из проекта регулируется ключом компиляции...

мелкое консервативное расширение с++

www_linux_org_ru ★★★★★ ()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от glebiao

поэтому меня очень порадовал этот тред: очевидно, что достигнута стадия э... саркастического :) интереса к Д

на всякий случай сообщу, что у меня саркастический интерес к десятку языков

www_linux_org_ru ★★★★★ ()
Ответ на: комментарий от www_linux_org_ru

и получаем 2-й пункт: хороший язык должен быть спроектирован так, чтобы быть отличным eDSL контейнером (т.е. хостом для eDSL)

Можно смотреть на это так:

- язык либо вообще не должен давать возможности делать eDSL. Но предоставлять простые средства для использования результатов работы внешних DSL;

- либо же возможности для встроенных DSL должны быть очень хорошими.

Тот же C++, имхо, не есть дружелюбный язык для eDSL. Но и не ограничивает желающих (что не есть хорошо на мой взгляд), что и приводит к вещам вроде старой Boost.Lambda или нынешнего Boost.Spirit. С другой стороны, #include позволяют легко интегрировать в C++код результаты кодогенерации из внешних DSL.

Java, например, убога как для eDSL, так и для подключения результатов генерации исходного кода.

C# в этом смысле, AFAIK, лучше Java. В одной из его версий дали возможность размещать код одного C#-класса в нескольких исходных файлах. Что упрощает использование кодогенераторов.

D с его string mixin-ами удобнее всего вышепречисленного. Поэтому для меня не суть важно, насколько у D хорошие средства для eDSL. Может лучше, чтобы они были совсем примитивными.

eao197 ★★★★★ ()
Ответ на: комментарий от www_linux_org_ru

RESTful принципами. Например такая вещь, как параметр «action» - дичайшее их нарушение.
почему?

Таким уж его придумали :) http://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_S...

«The PUT and DELETE methods are idempotent methods. The GET method is a safe method (or nullipotent), meaning that calling it produces no side-effects.»

Хотя чёткого стандарта на RESTful не существует, это довольно строгие правила построения API, согласно которым всё должно быть выражено в виде URI-объектов и операций над ними через HTTP-методы. Очень часто так называют любое HTTP RPC, но это ошибка.

Насколько я понимаю, главное преимущество такой архитектуры в дружелюбности к кэшированию. Но никогда серьёзно этот вопрос не изучал.

Dicebot ()
Ответ на: комментарий от www_linux_org_ru

наличие бесплатных компиляторов с открытыми исходниками и довольно приличным качеством, реализующих это «минимально обязательное», может считаться объективной предпосылкой?

Нет :) Это хорошая объективная предпосылка к тому, чтобы использовать именно этот язык на практике, но на оценку возможностей языка это не оказывает никакого влияния.

Dicebot ()
Ответ на: комментарий от www_linux_org_ru

а почему кстати нет ref как языковой сущности, а только параметр функций?

А чёрт его знает :) Я когда-то задал такой же вопрос и мне даже что-то ответили, но это было очень давно и я забыл. Мне вообще ссылки в том виде, что они есть в D и C++ кажутся излишеством, дающим слишком мало относительно обычных указателей, чтобы оправдать введение новой языковой конструкции. Вот если бы это были гарантированные non-nullable сущности...

и да, я все время хотел сказать, и все откладывал из-за более интересных вопросов в треде, так вот — лучше бы они 1500 баксов потратили на написание нормальной документации и design rationale, чтобы вот таких вот сомнений насчет «это такие странные правила, или может баг» у перебезчиков с с++ не возникало :-)

Насчёт спецификации - я заверяю тебя, это розовая мечта любого разработчика на D :) Вот только реалистичный бюджет для такой задачи будет больше примерно на два порядка - для этого нужно знать нюансы языка _очень_ детально. Таких людей мало и их время очень дорого ;)

А design rationale очень много в книге Александреску - The D Programming Language.

Dicebot ()
Ответ на: комментарий от www_linux_org_ru

сборщик мусора должен быть (но без слабых ссылок память все равно будет течь и с ним)

Сдается мне что Вы не понимаете что такое GC.

anonymous ()
Ответ на: комментарий от Dicebot

Мне вообще ссылки в том виде, что они есть в D и C++ кажутся излишеством, дающим слишком мало относительно обычных указателей, чтобы оправдать введение новой языковой конструкции.

Может в D вы про ссылки и правы. Но вот в C++ ссылки дают довольно много по сравнению с указателями. Вот, например, сразу навскидку:

* нельзя создать неинициализированную ссылку. Т.е. с указателями такое компилятор пропустит:

my_type_t * p; // Забыли проинициализировать.
А вот здесь сразу даст по рукам:
my_type_t & p; // Будет ошибка компиляции.

* ссылки явно указывают, когда ответственность за уничтожение объекта лежит на ком-то другом. Например, кто-то написал класс вида:

class my_type_t
{
  private :
    another_type_t * m_obj;

  public :
    my_type_t( another_type_t * obj ) : m_obj( obj ) {}
};
а потом этот код пришел к другому разработчику на сопровождение. Как определить — отсутствие деструктора и delete m_obj в нем — это ошибка или так и задумано? Тогда как если вместо указателя будет ссылка, то сразу понятно, что my_type_t не отвечает за уничтожение экземпляра another_type_t.

* ссылки позволяют эффективно и лаконично передавать аргументы. Например, если у меня есть:

void write_data_to( const data_t & data, const std::string & file_name );
то я могу вызывать ее так:
const data_t some_data = generate_some_data();
const std::string file_name = create_file_name();
write_data_to( some_data, file_name );
или так:
write_data_to( generate_some_data(), create_file_name() );
И ничуть не потеряю в эффективности во втором подходе, по сравнении с первым.

* ссылки дают возможность использования перегрузки операторов.

Ну а если еще учесть, что единственным легальным способом получить невалидную ссылку является разыменование невалидного указателя, а современный C++ дает возможность практически обходиться без голых указателей, то ссылки в C++ очень близки к тем самым non-nullable сущностям.

Так что по поводу ссылок в C++ вы погорячились.

eao197 ★★★★★ ()
Ответ на: комментарий от anonymous

Это ты не понимаешь. Мягкие и слабые ссылки есть в Java, например. Они действительно полезны, т.к. утечки бывают связаны не с ошибками в программе. Ты можешь поместить какой-то объект в какой-нибудь список каких-нибудь подписчиков, но при этом объект не будет иметь смысла существования, если не будет доступен в каком-то другом месте. В результате объект реально не нужен, но он не будет собран сборщиком, т.к. на него есть ссылка в том самом списке. Это как пример.

anonymous ()
Ответ на: комментарий от eao197

Хранение ссылки в поле объекта, кроме специальных случаев(локов, лямбд и пр.)чревато висячими ссылками... А из интерфейса конструктора нельзя понять, сохраним ли мы объект по ссылке, так что в общем случае это плохой подход. Ну и оператор= ломаем на ровном месте. И вообще ссылки имеют много ограничений, их по сути нельзя использовать как другие типы(в том числе указатели), так что подход D мне кажется более логичным.

anonymous ()
Ответ на: комментарий от anonymous

Хранение ссылки в поле объекта, кроме специальных случаев(локов, лямбд и пр.)чревато висячими ссылками...

Чревато не более, чем хранение указателя на чужой объект.

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Мне кажется, что возможность сослаться через разыменование NULL-указателя - очень большая проблема. Я очень часто слышу про вещи, которые «не принято делать в современном» С++, но этот язык и без того требует каждую каплю внимания. Если я чего и жду от системы типов в языке, так это как раз контроля подобных взрывоопасных ситуаций, а отнюдь не удобства.

Хотя, как я только что проверил, изменить ссылку после иницализации нельзя. Этого я не помнил и это очень хорошо :) Так что ссылки в С++ реально полезнее чем в D, хотя всё ещё и недостаточно полезны на мой взгляд.

Впрочем, во всём, что касается указателей и ссылок я с наибольшим интересом слежу за Rust.

Dicebot ()
Ответ на: комментарий от eao197

Более, т.к. в случае указателя очевидно, что нужно следить за временем жизни. В случае ссылки сам класс ничего не может сделать, а клиент может не догадываться о том, что ссылка была сохранена. В общем, это оправдано только для специальных случаев.

anonymous ()
Ответ на: комментарий от anonymous

Это логическая ошибка.

Очень часто это вообще не ошибка. Тебе, скажем, нужны подписчики, но заставлять их жить только ради тебя бессмысленно. И тут как раз различные виды нежестких ссылок выходят на сцену.

anonymous ()
Ответ на: комментарий от anonymous

Более, т.к. в случае указателя очевидно, что нужно следить за временем жизни.

Правда что ли? В чем же принципиальная разница между:

another_type_t a;
my_type_t b( &a );
a.some_method();
и
another_type_t a;
my_type_t b( a );
a.some_method();
в плане понятности контроля время жизни?

eao197 ★★★★★ ()
Ответ на: комментарий от anonymous

Это кривая архитектура, не надо ее оправдывать.

anonymous ()
Ответ на: комментарий от www_linux_org_ru

есть мнение, что она растет *исключительно* за счет техпроцесса (35 нм, например), который улучшаться будет очень медленно,

Это мнение беспочвенно. Вы можете сравнить Ivy Bridge и Haswell. Техпроцесс один и тот же, разница в производительности на той же частоте порядка 10%.

Техпроцесс совершенствуется стабильно уже многие годы, нет причин полагать что в ближайшее время (по крайней мере до достижения 14 нм) что-то изменится.

Атом действительно упростили, но сделано это было ради уменьшения эрергопотребления. Сейчас тот же ваттаж достигается уже обычными энергоэффуктивными процессорами.

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

Vudod ★★★★★ ()
Ответ на: комментарий от www_linux_org_ru

По-моему они просто решили не стирать типы, когда дженерики ввели. В Java решили иначе, ибо она уже широко применялась к моменту появления дженериков, кроме того, для некоторых систем была важна возможность писать новый код с использованием дженериков, не обновляя при этом jvm.

forCe ()
Ответ на: комментарий от Dicebot

Вот если бы это были гарантированные non-nullable сущности...

Ну в С++ нулевую ссылку можно получить лишь через хак. Правда она легко может оказаться висячей, если пользоваться ссылками не разумно.

forCe ()
Ответ на: комментарий от eao197

Ну не скажи. Обычно сохранение указателя будет «заметно» как для создателя класса, так и для клиента. Так что скорее всего, разработчики позаботятся о корректности(а если нет, то это будет легче обнаружить при code review или при следующих модификациях). Я уже не говорю о том, что обычно используются не сырые указатели, а умные.

forCe ()
Ответ на: комментарий от eao197

& говорит о том, что передается не объект, а его адрес. В то время как в случае ссылки вообще не ясно, что туда будет передано, копия, ссылка и пр. И потому логично не сохранять такой объект, поскольку это не очевидно синтаксически.

Если я увижу, что объект в конструкторе принимает указатель, я пойду в документацию/исходники, чтобы понять, кто отвечает за уничтожение объекта...

forCe ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.