- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
const Tifon& Tifon::operator=(const Tifon& Buffer)
{
assert(&Buffer!=this);
if(&Buffer==this)
return *this;
Tifon OldForExceptionSafe(*this);
try{
this->~Tifon();
::new((void*)this)Tifon(Buffer);
}catch(...){//try restore
::new((void*)this)Tifon(OldForExceptionSafe);
}
return *this;
};
//...
namespace std
{
const Tifon&swap (Tifon& a, Tifon& b) {
assert(&a!=&b);
if(&a==&b)
return a;
Tifon c(a);
a=b;
b=c;
}
};
что ты хотел сэкономить? реализацию assign?
тут на мой взгляд оператор = такой тривиальный, что можно было его совсем не писать - компилятор сам его создаст
а так у тебя лишняя аллокация, ручной вызов деструктора, инплейс конструктор... даже ; после },
+ взаимоисключающие assert и проверки - ты уж остановись на чем то одном
Он деструктор старого объекта вызовет перед конструированием? Или это будет голое копирование бинарных данных? Не пойдет, так как там в этом классе ссылки даже на члены в себе есть.
>несмотря на то, что начальник всегда прав
Он всегда не прав, я считаю. Но молчу.
> у тебя лишняя аллокация
Лолшто? Это вызов конструктора.
Tifon OldForExceptionSafe(*this);
это не вызов конструктора, это создание временного ненужного объекта
> ссылки даже на члены в себе
говнокодище
> голое копирование бинарных данных
иди читай что происходит по умолчанию в копирующем конструкторе и операторе присваивания
и да, заодно почитай про ADL и надо ли объявлять swap в namespace std
>и да, заодно почитай про ADL и надо ли объявлять swap в namespace std
Можно ссылку? Ну пожалуста. =)
на то, что в копирующем конструкторе будут вызваны копирующие конструкторы соответствующих членов? стандарт раздел 12
а вот тебе пример верного объявления swap
http://ideone.com/44HbH
тривиальный метод (конструктор, оператор =) - метод, который создастся компилятором
если все члены класса умеют своими копирующими конструкторами инициализировать себя, копирующий конструктор класса не нужен, т.к. хватает логики тривиального
если все члены класса умеют своими операторами = присваивать себя, оператор присваивания класса не нужен, т.к. хватает логики тривиального
проблемы начинаются, если делать внутри класса ссылки на члены класса, либо если пользоваться кучей без резинки (голые new, delete ...)
в жизни в большинстве этих редких случаев решает единственный метод assign, который напрямую используется в теле operator = и в теле конструктора копирования (если не смущает двойная инициализация - сначала дефолтная, а потом уже реальная)
а деструктор вообще ортогонален - он в тривиальном операторе = () не должен участвовать
может не стоит удалять больной зуб ректально?
повышение энтропии приводит к коду, который невозможно поддерживать
А, мои глаза... Что это? Как?
благодаря ему ты можешь перегружать operator << (std::ostream &, ...), например, который будет работать
насчет запиливания swap
17.4.3.1 Reserved names.
1) It is undefined for a C++ program to add declarations or definitions to namespace std or namespaces within namespace std unless otherwise specified. A program may add template specializations for any standard library template to namespace std. Such a specialization (complete or partial) of a standard library template results in undefined behavior unless the declaration depends on a user-defined name of external linkage and unless the specialization meets the standard library requirements for the original template.
т.е. ты имеешь право, но только в случае ну а без adl у тебя не срастался бы никогда поиск корректного оператора http://ideone.com/9dN1e
ассерт работает только в дебаге, так что нужны проверки. компания Гугл по кодестайлу всегда настаивает исправить ситуацию возможного провала ассерта в релзе.
Ты где это углядел? Похоже ты меня троллешь.
а вообще нахуй забивать голову правилом, где нужно ставить, а где можно не ставить, если можно просто везде ставить?
обсуждалось уже
потому что компилятор должен как-то отличать
struct some { body };
struct some { body } var;
ты можешь сделать http://ideone.com/KykAM
это фича языка, которая не сочетается с "ничего сложного придумать имя"
и как бы дельфинам не нравилось "крестоблядство!!11 если запомнить однобитное правило когда ставить точку с запятой после закрывающей скобки, у меня не хватит времени программировать мышкой", это таки придется освоить
как и то, что перед else тоже идёт statement (а не как в паскале, везде ставим точку с запятой, а перед ним не ставим)
я смотрю тут тред добра, хейтеры расставили мне минусы, а тарасу - плюсы, кто бы говорил про виртуалов
В Паскале ";" - разделитель.
В Си ";" - терминатор
Шварц?
черный
Типа "конфеты - сладкое, сладкие конфеты дарят на Рождество, Рождество - холодно, где холодно - на Северном полюсе.
Поцоны айда на Северный полюс!!!"
Я в этой теме виртуалов не применял и тебе минусы не ставил.
Как ведёт себя сишка, не знаю.
прокомментируй, пожалуйста, результат паскалевской киллир-фичи "tagged variant record" http://ideone.com/nr9m1 - она же сама должна проверять, к какому полю я имею право обращаться, а к какому нет
или вот еще fpc, не то, что крестоговно - отличный образчик надежного компилятора, построенного по утвержденному международному стандарту: http://ideone.com/IjNdV
Лол, ты тугой штоле? Это не tagged variant record.
Пользователь USB получает предупреждение, за нарушение правила 2.2.1 данного сайта.
Пользователь USB получает бан до 25.07.2012, за обсуждения действий модератора.
Приводя пример надёжных проверяемых tagged unions, позволяющих запихивать неподы в ветки и с корректным поведением неподов, я всегда говорил про Аду.
Я исправляю ситуацию по мере сил, но их не хватает.
Есть ещё версия, что Тарас локаничен и короток в своих ответах вроде:
> ты хуй
а вы постоянно цитируете стандарт, @defecate++, а бывает и на буржуйском наречии, что минурастов приводит в ступор, заставляя активно минусовать.
И да, он знает где ты живешь.
И НЕ ЗЛИ МЕНЯ БОЛЬШЕ!!!
Хомячков злить не опасно.
>и он знает где ты живешь.
и он не знает где я живу!
У меня для вас плохие новости. (с)
> namespace std { ... }
Зачем срешь не в свой неймспейс?
> const Tifon&swap (Tifon& a, Tifon& b) {
Зачем swap возвращает значение?
> }catch(...){//try restore
Что там за конструктор копирования такой, что надо обрабатывать брошенные из него исключения? И самое забавное - ну вот выкинул тот конструктор исключение, присваивание откатило объект обратно, вся логика алгоритмов, выполняемых над этим классом пошла под откос. Нахуй так жить...
Начальник прав. Код полное говно.
https://ru.wikipedia.org/wiki/Тифон
Тогда уж. Раз такая надежность нужна.
Найти инъекцию и выполнить
Хочешь пирожок?
Всю жизнь ты будешь скрываться, и бояться что инфа о тебе проскочит в интернет... Будешь по 10 раз перепроверять каждое отправляемое сообщение... По ночам ты не сможешь спать, просыпаясь от страшных снов, про то как ГК узнал кто ты и рассказал начальнику... Совесть будет грызть тебя. И, став 80летним параноиком ты придешь к начальнику, и все ему расскажешь.
Присылайте и дальше нам свои работы.
ну и нахуй вы нам тут не нужны
Кто все эти люди?