LINUX.ORG.RU

Тёмные углы C и C++

 ,


13

8

Изначально даный пост предназначался для habrahabr, но местные модераторы его не пропустили без объяснения причин:

Увы, ваш топик «Тёмные углы C и C++» не был одобрен и не попал в общую ленту. Причин этому может быть много, но просим не терроризировать службу технической поддержки, так как там вашу статью даже не видели. Расстраиваться тоже не стоит - попробуйте опубликовать что-нибудь еще.

С уважением, Хабрахабр

В связи с этим выкладываю его сюда.

Я, как и многие из вас, работаю программистом. Официально моя должность не привязана к какому-либо конкретному языку программирования, что, кстати говоря, прекрасно, ведь для каждой задачи должны быть свои инструменты. Но довольно часто выбора просто нет (например, из-за особенностей реализации той или иной платформы), в связи с чем подавляющее большинство моих проектов пишутся на C++.

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

Думаю, вы со мной согласитесь, что C++ — язык с очень высоким порогом вхождения. Серьёзно! Я изучаю этот язык уже больше 3 лет, и практически каждую неделю открываю в нём что-то новое и удивительное. Именно об этом «новом и удивительном» и пойдёт речь в данной статье.

За то время, пока я изучал C++, у меня потихоньку накапливались интересные задачки, сниппеты и просто необычные куски кода, которыми я делился с коллегами по работе и знакомыми. У нас даже появилась своего рода традиция — каждый рабочий день с того момента, как я пришёл в компанию, я выкладывал по две новых задачки, которые мы старались по возможности обсудить в перерывах. Постепенно их набиралось всё больше и больше, пока, наконец, я не стал забывать некоторые из них. Именно в тот момент я решил предпринять попытку составления сборника так называемых «тёмных углов» C и C++. Я собрал воедино все те куски кода, что видел до сих пор, дополнил их цитатами из различных стандартов и продолжил копить свою «коллекцию». Изначально моей целью было собрать вместе всего 100 задачек, но я и оглянуться не успел, как их стало уже 200, 300 и вот теперь 400. На самом деле, их даже больше, но на данном этапе я решил ограничиться именно этим количеством.

Итак, представляю Вашему вниманию книгу «C and C++ Dark Corners». Конечно, назвать её книгой можно с натяжкой, ведь это, как я уже и сказал, сборник интересных и для кого-то малоизвестных мест C и С++.

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

В качестве примера приведу несколько вопросов из книги:

97. Что попадёт в stdout в результате выполнения след. кода и почему?

#include <iostream>
#include <memory>

#include <boost/smart_ptr/scoped_ptr.hpp>

class Foo
{
public:
 ~Foo() { std::cout << "Foo::~Foo() \n"; }
};

class Bar : public Foo
{
public:
 ~Bar() { std::cout << "Bar::~Bar() \n"; }
};

class Baz : public Bar
{
public:
 ~Baz() { std::cout << "Baz::~Baz() \n"; }
};

int main()
{
 std::cout << 1 << '\n';
 {
  Foo* instance = new Baz;
  delete instance;
 }

 std::cout << 2 << '\n';
 {
  std::shared_ptr<Foo> instance(new Baz);
 }

 std::cout << 3 << '\n';
 {
  std::shared_ptr<Foo> instance(false ? new Bar : new Baz);
 }

 std::cout << 4 << '\n';
 {
  boost::scoped_ptr<Foo> instance(new Baz);
 }

 std::cout << 5 << '\n';
 {
  std::unique_ptr<Foo> instance(new Baz);
 }

 std::cout << 6 << '\n';
 {
  std::auto_ptr<Foo> instance(new Baz);
 }
}

A: Первый случай уже обсуждался ранее – здесь UB в чистом виде (как правило, это приводит к тому, что не будет вызван деструктор производного класса).

Второй случай выдаст на экран следующее:

Baz::~Baz()

Bar::~Bar()

Foo::~Foo()

Почему? Что произошло? Ведь мы же ясно видим, что деструкторы у данных классов не являются виртуальными. Или это один из частных случаев UB? На самом деле, тут всё вполне законно и должно работать так, как указано выше. Посмотрим в документацию к std::shared_ptr и boost::shared_ptr:

http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

Proper delete expression corresponding to the supplied type is always selected, this is the reason why the constructors are implemented as templates using a separate parameter Y.

http://www.boost.org/doc/libs/1_51_0/libs/smart_ptr/shared_ptr.htm

This constructor has been changed to a template in order to remember the actual pointer type passed. The destructor will call delete with the same pointer, complete with its original type, even when T does not have a virtual destructor, or is void.

Третий случай выдаст:

Bar::~Bar() Foo::~Foo()

Почему? Ведь мы только что обсуждали поведение std::shared_ptr! Что тут не так? Вспомните поведение тернарного оператора в C++ — он требует, чтобы второй и третий его операнды были одинакового типа. Более того, каст от базового к производному касту без лишних действий не выполнить, в отличие от обратной ситуации:

#include <iostream>

class Base
{
};

class Derived : public Base
{
};

int main()
{
 Base* first;
 Derived* second;

 Base* foo = second; // Ok
 Derived* bar = first; // Error: invalid conversion from 'Base*' to 'Derived*'
}

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

#include <iostream>
#include <typeinfo>

template <typename T, typename U>
auto foo(bool b, T t, U u)-> decltype(b ? t : u)
{
 return b ? t : u;
}

int main()
{
 auto _1 = foo(true, 0, 'c');
 std::cout << typeid(_1).name() << '\n';
 auto _2 = foo(false, 0, 'c');
 std::cout << typeid(_2).name() << '\n';
}

Переменные _1 и _2 будут одного и того же типа – int.

Именно поэтому Baz в данном случае будет приведён к Bar.

4, 5 и 6 случаи ничем не отличаются от первого – здесь UB. Надо помнить, что поведение std::shared_ptr отличается от остальных умных указателей.

43. Зачем может понадобиться писать так

#define DO_JOIN(FOO, BAR) DO_JOIN1(FOO, BAR)
#define DO_JOIN1(FOO, BAR) FOO##BAR

вместо

#define DO_JOIN(FOO, BAR) FOO##BAR

A: Потому что препроцессор отработает конкатенацию не так, как того ожидал программист, в том случае, если в качестве аргумента(-ов) мы передадим в макрос DO_JOIN другой макрос:

#include <iostream>

#define DO_JOIN(FOO, BAR) DO_JOIN1(FOO, BAR)
#define DO_JOIN1(FOO, BAR) FOO##BAR

#define MY_MACRO 5

int main()
{
 std::cout << DO_JOIN(1, MY_MACRO) << '\n';
}

Output:

15

#include <iostream>

#define DO_JOIN(FOO, BAR) FOO##BAR

#define MY_MACRO 5

int main()
{
 std::cout << DO_JOIN(1, MY_MACRO) << '\n';
}

error: unable to find numeric literal operator 'operator"" MY_MACRO'

Получается, макрос MY_MACRO не успел раскрыться, в результате чего была попытка провести конкатенацию с 1 и MY_MACRO, что, разумеется, привело к ошибке.

ISO/IEC 14882:2011

16.3.1 Argument substitution [cpp.subst]

1 After the arguments for the invocation of a function-like macro have been identified, argument substitution takes place. A parameter in the replacement list, unless preceded by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is replaced by the corresponding argument after all macros contained therein have been expanded. Before being substituted, each argument’s preprocessing tokens are completely macro replaced as if they formed the rest of the preprocessing file; no other preprocessing tokens are available.

44. Что попадёт в stdout в результате выполнения след. кода?

#include <iostream>
#include <stdexcept>

struct Foo
{
 Foo() { std::cout << "Foo::Foo()" << std::endl; }
 ~Foo () { std::cout << "Foo::~Foo()" << std::endl; }
};

void foo()
{
 Foo bar;
 throw std::runtime_error("Error");
}

int main ()
{
 foo();
}

A: Зависит от реализации.

// 1

Foo::Foo()

// 2

Foo::Foo() Foo::~Foo()

ISO/IEC 14882:2011

15.3 Handling an exception [except.handle]

9 If no matching handler is found, the function std::terminate() is called; whether or not the stack is unwound before this call to std::terminate() is implementation-defined (15.5.1).

Например, в документации к gcc сказано, что раскрутки стека не произойдёт:

The stack is not unwound before std::terminate is called.

Сборник выкладывается на бесплатной основе, желающим помочь каким угодно образом буду безумно признателен и благодарен. По любым вопросам, рекомендациям и пожеланиям Вы можете обращаться на мой электронный ящик nikita.trophimov@gmail.com. Буду рад услышать абсолютно любое мнение по данному поводу.

В книге ещё много чего можно и даже нужно дорабатывать. Обещаю, что если сообщество проявит хоть какой-то интерес к данному проекту, я продолжу развивать его согласно Вашим предпочтениям и пожеланиям, дополнять новыми задачками и исправлять ошибки. У меня есть много мыслей по поводу улучшения «C and C++ Dark Corners» — среди них добавление тематических разделов, workaround'ы для различных компиляторов и т.д. Главное, чтобы этот интерес был не только с моей стороны.

Жду Ваших положительных и отрицательных отзывов, рекомендаций и, конечно, новых задачек.

Внимательно ознакомьтесь с тем, что указано во «введении», и приятного чтения!

Сабж нужно было постепенно выкладывать на stackowerflow, тогда от него, может быть, был бы толк. А так это сборник вопросов для ушибленных любителей спрашивать подобный порожняк на собеседованиях. Какое отношение изучение всего этого шлака имеет к созданию хороших программ на С++ - не понятно. Ну кого заботит будет ли вызван какой-то там деструктор в глубине кода, если необработанное исключение пролетает точку входа?

P.S. Это всё равно, что исследовать решения физических задач, не имеющие физического смысла. Занятие весьма бестолковое как с точки зрения физики, так и математики тоже.

asaw ★★★★★
()
Последнее исправление: asaw (всего исправлений: 2)

я видел это еще в четверг и на одной странице.

когда пишешь на C++ - важно херней не страдать, а писать чисто и аккуратно, и все будет ок.
за книгу спасибо, почитаю

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

Ну кого заботит будет ли вызван какой-то там деструктор в глубине кода, если необработанное исключение пролетает точку входа?

++

dib2 ★★★★★
()

Думаю, вы со мной согласитесь, что C++ — язык ненужный, ибо есть ява и сабжевая книга — доказательство этому.

Пофиксил, ага.

anonymous
()

std::unique_ptr обладает семантикой move-копирования

move-копирования

Шикарная терминология :-)

Begemoth ★★★★★
()

Хорошй программист пишет такой код, который не вызывает подобных вопросов. При обнаружении такого кода - переписать.

vromanov ★★★
()

Хмм, pdf получен из Microsoft Word 2013, содержит стандартные вендовые шрифты, и почему ещё никто не высказался за бан?

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

Сабж нужно было постепенно выкладывать на stackowerflow, тогда от него, может быть, был бы толк

Большинство из представленных в книге вопросов итак в той или иной степени есть на StackOverflow.

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

Вы «введение» читали? Про это-то там как раз и написано:

Примеры, которые будут продемонстрированы в данной книге, могут показаться Вам чересчур надуманными и нереальными. Отчасти Вы правы – применять большинство из них на практике вряд ли придёт в голову даже самому изощрённому программисту, но ведь из малого рождается большое, не правда ли? Впрочем, можете расценивать всё это как приёмы, которые Вы можно показать своим коллегам на досуге. А может Вы просто хотите подготовиться к собеседованию на вакансию программиста C или C++? Или же сами проводите интервью и ищете какие-то нестандартные вопросы для тех, кто будет их впоследствии проходить? Что ж, тогда эта книга сделана специально для Вас.

NikitaTrophimov
() автор топика
Ответ на: комментарий от x0r

А что в этом плохого? Я хотел поделиться информацией с людьми, а каким уж там именно образом - мне, в принципе, без разницы. Просто на habrahabr его гораздо больший процент людей смог бы заметить (многие с ЛОРа итак там сидят).

NikitaTrophimov
() автор топика
Ответ на: комментарий от dib2

я видел это еще в четверг и на одной странице.

В смысле? О чём Вы?

когда пишешь на C++ - важно херней не страдать, а писать чисто и аккуратно, и все будет ок.

Верно, во «введении» я об этом уже сказал.

за книгу спасибо, почитаю

Буду ждать фидбека!

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

Ну, почему же страдания? Страдания - это когда такой код пишешь. А вот когда такой код рассматриваешь лишь с точки зрения задачек для разминки своих знаний в плане стандартов - вполне ничего.

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

Вы «введение» читали? Про это-то там как раз и написано:

Во-во. Но вообще-то я сначала хотел использовать слово «дрочерство», но удержался. Теперь исправляюсь.

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

Вы меня пересказываете?

Примеры, которые будут продемонстрированы в данной книге, могут показаться Вам чересчур надуманными и нереальными. Отчасти Вы правы – применять большинство из них на практике вряд ли придёт в голову даже самому изощрённому программисту, но ведь из малого рождается большое, не правда ли? Впрочем, можете расценивать всё это как приёмы, которые Вы можно показать своим коллегам на досуге. А может Вы просто хотите подготовиться к собеседованию на вакансию программиста C или C++? Или же сами проводите интервью и ищете какие-то нестандартные вопросы для тех, кто будет их впоследствии проходить? Что ж, тогда эта книга сделана специально для Вас.

Разумеется, это не книга не о хорошем коде. Это книга о том, какие тонкости несут в себе стандарты C и C++.

NikitaTrophimov
() автор топика
Ответ на: комментарий от Begemoth

Вы хотите поспорить, какая ОС круче? Не холивара ради, а справедливости для - я использую и Windows, и Linux, и Mac OS X. Для каждой задачи свои инструменты, сами знаете. А вот кричать, что какая-то ОС круче другой - просто глупо, на мой взгляд.

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

Для каждой задачи свои инструменты, сами знаете. А вот кричать, что какая-то ОС круче другой - просто глупо, на мой взгляд.

Это тонкий намек на LaTeX :))

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

Никто и не предлагает ни на что, как Вы выразились, «дрочить». Я рассматриваю «C and C++ Dark Corners» как средство для разминки мозгов в плане языка. Ещё раз повторяюсь - именно языка, а не технологий и архитектуры. Писать такие программы не надо, это и дураку понятно.

NikitaTrophimov
() автор топика
Ответ на: комментарий от asaw

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

NikitaTrophimov
() автор топика

Никита, вы не обижайтесь, просто местная публика в основной массе на все готова, лишь бы рассказать почему «ваша идея говно, почему вы сами говно, и что есть труЪ» (С) где-то с цитатника.

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

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

NikitaTrophimov
() автор топика
Ответ на: комментарий от asaw

Так фидбека-то и не было, к сожалению. Они ничего не написали в ответе по поводу отказа в публикации.

NikitaTrophimov
() автор топика
Ответ на: комментарий от Chaser_Andrey

Спасибо большое! Буду ждать фидбека сюда или на почтовый ящик.

NikitaTrophimov
() автор топика
Ответ на: комментарий от asaw

Глупая позиция. Кому интересно — почитают, кому нет — пройдут мимо. Ты допускаешь то, что изучение языка может быть кому-то интересным само по себе? И не всё упирается в решение конвеерных практических задач.

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

Вы будете удивлены, но на Хабре я не сижу. Опубликовать там статью решил лишь по рекомендации знакомого и потому, что это, на мой взгляд, довольно популярный среди IT'шников ресурс.

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

NikitaTrophimov
() автор топика
Ответ на: комментарий от Chaser_Andrey

Глупая позиция. Кому интересно — почитают, кому нет — пройдут мимо. Ты допускаешь то, что изучение языка может быть кому-то интересным само по себе? И не всё упирается в решение конвеерных практических задач.

Вот надо было мне, всё же, написать там про дрочерство. Дело в том, что любителей обсасывать подобные кейсы с годами становится всё больше и больше. И в итоге людям, разрабатывающим программы, тоже приходится включаться в процесс обсасывания всей этой ерунды, чтобы не выглядеть дураками на собеседованиях. Заметь, есть книги Скотта Майерса и им подобные, с паттернами и антипаттернами, но обсуждают почему-то именно подобную хрень.

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

У Саттера, Майерса и подобных, между прочим, тоже было многое из того, что есть в данной книге - объявления функций вместо вызова конструктора, тела у чисто витуальных функций, etc. Так что не надо уж про них тут говорить.

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

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

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

Чем тебя не устраивает так называемое дрочерство с языками? Задевает, что другие занимаются им? Как я уже написал, люди могут изучать язык в удовольствие для себя и общаться с окружающими. Не нравится — можешь пройти мимо.

Но нет, тебе настолько похер на обсасывание ерунды, что ты даже не можешь молчать об этом! :)

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

4.2. Джуниоров про такие тонкости редко спрашивают, а сеньйоры — на то они и сеньйоры, чтобы знать подводные камни.

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

4.2. Джуниоров про такие тонкости редко спрашивают, а сеньйоры — на то они и сеньйоры, чтобы знать подводные камни.

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

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

Чем тебя не устраивает так называемое дрочерство с языками?

Я, кажется, уже 2 раза написал.

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

ТС не писал, что ему нужна исключительно одобрительная критика.

4.2. Джуниоров про такие тонкости редко спрашивают, а сеньйоры — на то они и сеньйоры, чтобы знать подводные камни.

Вот я об этом и говорю: в итоге синьорам приходится разбираться в сабжевом шлаке.

P.S. Я, тем не менее, благодарен автору за то, что он проделал работу по сбору всего этого с просторов инторнетов в одно место - можно будет использовать как справочник ненужных вопросов, на которые уже были даны ответы.

asaw ★★★★★
()
Последнее исправление: asaw (всего исправлений: 1)

Хорошо, что пост попал сюда ибо хабра скатилась :-)

Насчет наездов, что якобы это дрочерство, имхо отчасти верно. Скажем так, истина по-середине. Люди разные и мыслим по-разному. Как и в си/си++ другие яп имеют свои тонкости и особенности, но как заметили остальные - обычно так не делают. И думаю, об этом многие просто не задумываются: кто-то очень внимательно читает доки, кто-то забивает болт на все тонкости, а кто-то фигачит подобный код и спотыкается, когда он не работает, как полагалось.

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

В любом случае основная работа сделана и на этом большее спасибо.

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

Насчет наездов, что якобы это дрочерство, имхо отчасти верно. Скажем так, истина по-середине. Люди разные и мыслим по-разному. Как и в си/си++ другие яп имеют свои тонкости и особенности, но как заметили остальные - обычно так не делают. И думаю, об этом многие просто не задумываются: кто-то очень внимательно читает доки, кто-то забивает болт на все тонкости, а кто-то фигачит подобный код и спотыкается, когда он не работает, как полагалось.

Согласен.

В любом случае основная работа сделана и на этом большее спасибо.

Спасибо большое за ответ!

NikitaTrophimov
() автор топика
Ответ на: комментарий от asaw

ТС не писал, что ему нужна исключительно одобрительная критика.

Верно, нужна любая.

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

Пожалуйста, рад помочь хотя бы этим.

NikitaTrophimov
() автор топика
Ответ на: комментарий от x0r

На хоботе

И давно это хабр хоботом называют? Раньше только за ixbt это название было.

i-rinat ★★★★★
()

Ого, спасибо за труды. Судя по количеству страниц и задач, работы Вы проделали немало. Комментарии по оформлению:

  • Название книги на английском, хотя практически всё остальное на русском.
  • Местоимение «вы» пишется с большой буквы только при личном обращении. В книгах/статьях/объявлениях «Вы» не место, так как обращение к «читателю» или «аудитории» не является личным.
  • Очень не хватает содержания и, возможно, индекса, чтобы книгу можно было использовать как справочник. Возможно разумно выделить какие-то тематики и собрать подобные вопросы ближе друг к другу.
  • Было бы неплохо ещё иметь архив исходных текстов примеров из книги.

P.S. Не прошло на Хабре так как текст здесь состоит из введения и примеров из книги, а тамошние модераторы любят чтобы было больше нового текста написано. Но это мои догадки.

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

Ого, спасибо за труды

Пожалуйста. Надеюсь, Вам будет интересно прочитать данную книгу

Комментарии по оформлению

Спасибо большое за заменчания, исправлю.

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

Да, я об этом писал в самом начале:

У меня есть много мыслей по поводу улучшения «C and C++ Dark Corners» — среди них добавление тематических разделов, workaround'ы для различных компиляторов и т.д. Главное, чтобы этот интерес был не только с моей стороны

Было бы неплохо ещё иметь архив исходных текстов примеров из книги.

Я думал о добавлении ссылок на онлайн-компилятор для каждого из примеров, приведённых в книге, однако после LWS я так и не смог найти ни одного по-настоящего хорошего онлайн-компилятора с поддержкой boost.

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

Возможно, но было бы не плохо, если бы они писали причину самостоятельно.

NikitaTrophimov
() автор топика

Внимательно ознакомьтесь с тем, что указано во «введении», и приятного чтения!

Ну, не спорю, очередная книга из серии «Мы расковыриваем недостатки дизайна языка». Ну, может быть, кому-то в чем-то интересно. Но где во всем этом Вы? Где Ваш анализ, где попытки применения этих самых «темных углов»? К чему это все? Одобряю позицию хабравских модераторов, уж извините.

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

среди них добавление тематических разделов

Ну да, я это прочёл и забыл...

Я думал о добавлении ссылок на онлайн-компилятор для каждого из примеров, приведённых в книге, однако после LWS я так и не смог найти ни одного по-настоящего хорошего онлайн-компилятора с поддержкой boost.

Онлайн-компилятор может быть неплохим дополнением, но набор файлов как по мне удобнее. Во-первых, не зависит от подключения к сети, во-вторых избавляет от необходимости самому копировать/скачивать текст в файл. Учитывая, что читаются такие книги на машинах с несколькими рабочими компиляторами C++, необходимости в онлайн-компиляторе особой не вижу.

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