- 1
TPrimitive a((TLine())), b((TCircle()));
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+7
TPrimitive a((TLine())), b((TCircle()));
Вынужденный говнокод.
Должно быть:
TPrimitive a(TLine()), b(TCircle());
http://iproc.ru/2012/08/cpp-copy-constructor/
http://ideone.com/rQTUO
Интересно, это как-то связано со ссылкой "Функция — конопля" после статьи?
Процитирую C++98 12.6.1 Explicit Initialization
An object of class type can be initialized with a parenthesized expression-list, where the expression-list is
construed as an argument list for a constructor that is called to initialize the object. Alternatively, a single
assignment-expression can be specified as an initializer using the = form of initialization.
Автор точно ебанулся. Там же в стандарте и пример есть, в котором Complex инициализируют тройкой.
P.S. Комментарий от автора статьи
Всё сказанное здесь не относится к Visual Studio. В этой системе, вопреки стандартам, инициализация равенством эквивалентна инициализации скобками
Как-будто в gcc не так...
императивное присваивание
P.S. Из ЯП самые годные равенства в MetaFont - они умеют решать линейные уравнения (присваивание там осуществляется отдельным оператором :=)
Подтвержу этого КО.
будем честны
стандарт различает direct-initialization (mytype a(1);) от copy-initialization (mytype a = 1;) - например, 8.5/14 + 12.3.1
но в том же 8.5/14 написано про copy-initialization In certain cases, an imple-mentation is permitted to eliminate the copying inherent in this direct-initialization by constructing
the intermediate result directly into the object being initialized; see 12.2, 12.8.
tion is a constructor, the call initializes a temporary of the destination type. The result of the call
(which is the temporary for the constructor case) is then used to direct-initialize, according to the
rules above, the object that is the destination of the copy-initialization.
Семантика такова, что создается временная переменная (хотя компилятор, конечно, может этим и не заниматься)... Т.е. автор все-таки был прав, что copy-initialization может оказаться медленнее, чем direct-initialization.
P.S. Но вот "вопреки стандарту" автору я не прощу ;)
P.P.S. Вот за что я люблю и одновременно ненавижу с++ - так это то, что каждый месяц я узнаю какую-нибудь новую его тонкость.
Вам довелось наткнуться на довольно сырой вариант статьи, с которым я и сам уже не согласен. С тех пор я многое исправил, в том числе терминологию, цитаты из стандарта, изменил общий тон в сторону более нейтральной точки зрения.
Хм, интересный факт. Спасибо за инфу ;)
но этим флагом обычно никто не пользуется
Харе придуриваться.
поэтому что конкретно ты про "= запрещено" имеешь в виду - конструктор копирования в привате, оператор присваивания в привате, корпоративные запреты на = (может твоему начальству приятно глазу только :=, и поэтому использование в любых языках = и == строго запрещено с занесением, следует применять методы eq и ass)
> Dummy00001 7 минут назад
Ви, таки, комментариев не читаете?
читаю. но честно говоря я и не уловил что defecate-plusplus хотел сказать.
"Talk is cheap. Show me the code" (c) Linus Torvalds
еще хотел сказать, что если конструктор explicit, то букв получится больше, чем ожидается - но мне было лениво
но тут проблема высосана из пальца - какие то пустые конструкторы передаются - так что говнокод не в синтаксисе, а глубже
boost::variant<_>::variant найдешь в гугле
Dummy00001
>TPrimitive a = TLine(), b = TCircle();
http://ideone.com/2sfxa
TPrimitive библиотечный, писал его не я и менять не могу.
так а где все определения? ясно что на пустом примере оно работать не будет.
то что defecate про explicit говорит, и что для 100% надежности я должен был написать, выглядит вот так:
> TPrimitive a = TPrimitive(TLine());
> TPrimitive b = TPrimitive(TCircle());
http://ideone.com/5aOXM
http://ideone.com/SQDyX
результат: я успешен
Да, да, цитирование с тегами.
Я бы не стал так радикально заявлять. Гляньте, вас же на говнокодике минусуют.
Не начать ли мне пиписюнческую деятельность, что бы стать успешым?
Я лишь процитировал результат компиляции в ideone.com
1. Нет болда
2. Пишут "успешно", а не "успешен"
3. Не пишут местоимение "я успешен", которое вы так аккуратно затёрли при цитировании с тегами, что бы снять с себя подозрение.
Так что ваше "лишь процитировал" - враки. Не цитата это.
Но все ходы записаны, изначально было
>> результат: я успешен
в чем ты успешен??? в том что ты две функции - a и b - объявил?
оно у тебя компилируется потому что ничего не делает.
ГК сверху как раз есть (кривоватая и непортабельная) попытка создать два объекта - a и b.
Lolshito?
Оно компилируется так как и задумывалось. Какие функции? Стандарт языка что-ли ещё наизусть не выучил?
Вот доказательство, что-никаких функций a и b нет:
http://ideone.com/67pPg
HaskellGovno
> TPrimitive библиотечный, писал его не я и менять не могу.
Что в этих словах тебе не понятно? Могу пояснить по хардкору.