- 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;
}
};
USB 22.07.2012 11:38 # −1
defecate-plusplus 22.07.2012 11:45 # +6
что ты хотел сэкономить? реализацию assign?
тут на мой взгляд оператор = такой тривиальный, что можно было его совсем не писать - компилятор сам его создаст
а так у тебя лишняя аллокация, ручной вызов деструктора, инплейс конструктор... даже ; после },
+ взаимоисключающие assert и проверки - ты уж остановись на чем то одном
USB 22.07.2012 11:56 # −6
Он деструктор старого объекта вызовет перед конструированием? Или это будет голое копирование бинарных данных? Не пойдет, так как там в этом классе ссылки даже на члены в себе есть.
>несмотря на то, что начальник всегда прав
Он всегда не прав, я считаю. Но молчу.
> у тебя лишняя аллокация
Лолшто? Это вызов конструктора.
defecate-plusplus 22.07.2012 12:11 # +4
Tifon OldForExceptionSafe(*this);
это не вызов конструктора, это создание временного ненужного объекта
> ссылки даже на члены в себе
говнокодище
> голое копирование бинарных данных
иди читай что происходит по умолчанию в копирующем конструкторе и операторе присваивания
и да, заодно почитай про ADL и надо ли объявлять swap в namespace std
USB 22.07.2012 12:12 # −2
>и да, заодно почитай про ADL и надо ли объявлять swap в namespace std
Можно ссылку? Ну пожалуста. =)
defecate-plusplus 22.07.2012 12:25 # +3
на то, что в копирующем конструкторе будут вызваны копирующие конструкторы соответствующих членов? стандарт раздел 12
а вот тебе пример верного объявления swap
http://ideone.com/44HbH
TarasB 22.07.2012 12:56 # 0
defecate-plusplus 22.07.2012 13:28 # −1
тривиальный метод (конструктор, оператор =) - метод, который создастся компилятором
если все члены класса умеют своими копирующими конструкторами инициализировать себя, копирующий конструктор класса не нужен, т.к. хватает логики тривиального
если все члены класса умеют своими операторами = присваивать себя, оператор присваивания класса не нужен, т.к. хватает логики тривиального
проблемы начинаются, если делать внутри класса ссылки на члены класса, либо если пользоваться кучей без резинки (голые new, delete ...)
в жизни в большинстве этих редких случаев решает единственный метод assign, который напрямую используется в теле operator = и в теле конструктора копирования (если не смущает двойная инициализация - сначала дефолтная, а потом уже реальная)
а деструктор вообще ортогонален - он в тривиальном операторе = () не должен участвовать
USB 22.07.2012 13:39 # −1
defecate-plusplus 22.07.2012 13:57 # +2
может не стоит удалять больной зуб ректально?
повышение энтропии приводит к коду, который невозможно поддерживать
USB 22.07.2012 17:30 # −3
USB 22.07.2012 13:43 # 0
TarasB 22.07.2012 13:55 # +1
USB 22.07.2012 13:10 # −1
А, мои глаза... Что это? Как?
USB 22.07.2012 13:12 # −1
USB 22.07.2012 13:15 # −1
defecate-plusplus 22.07.2012 13:29 # +1
благодаря ему ты можешь перегружать operator << (std::ostream &, ...), например, который будет работать
USB 22.07.2012 13:36 # −1
defecate-plusplus 22.07.2012 13:49 # 0
насчет запиливания 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
USB 22.07.2012 12:08 # −3
ассерт работает только в дебаге, так что нужны проверки. компания Гугл по кодестайлу всегда настаивает исправить ситуацию возможного провала ассерта в релзе.
USB 22.07.2012 12:09 # −4
Ты где это углядел? Похоже ты меня троллешь.
TarasB 22.07.2012 12:17 # −1
Fai 22.07.2012 12:23 # +2
TarasB 22.07.2012 12:54 # +1
defecate-plusplus 22.07.2012 13:30 # +3
TarasB 22.07.2012 13:56 # 0
а вообще нахуй забивать голову правилом, где нужно ставить, а где можно не ставить, если можно просто везде ставить?
defecate-plusplus 22.07.2012 14:02 # +3
обсуждалось уже
потому что компилятор должен как-то отличать
struct some { body };
struct some { body } var;
TarasB 22.07.2012 14:07 # 0
defecate-plusplus 22.07.2012 14:12 # +3
ты можешь сделать http://ideone.com/KykAM
TarasB 22.07.2012 14:16 # 0
defecate-plusplus 22.07.2012 14:24 # +2
TarasB 22.07.2012 14:43 # +1
defecate-plusplus 23.07.2012 13:42 # +5
это фича языка, которая не сочетается с "ничего сложного придумать имя"
и как бы дельфинам не нравилось "крестоблядство!!11 если запомнить однобитное правило когда ставить точку с запятой после закрывающей скобки, у меня не хватит времени программировать мышкой", это таки придется освоить
как и то, что перед else тоже идёт statement (а не как в паскале, везде ставим точку с запятой, а перед ним не ставим)
я смотрю тут тред добра, хейтеры расставили мне минусы, а тарасу - плюсы, кто бы говорил про виртуалов
Fai 23.07.2012 13:49 # 0
В Паскале ";" - разделитель.
В Си ";" - терминатор
vistefan 24.07.2012 09:36 # +1
Шварц?
absolut 24.07.2012 09:48 # +2
черный
SmackMyBitchUp 24.07.2012 09:55 # +1
3.14159265 26.07.2012 19:52 # +2
Типа "конфеты - сладкое, сладкие конфеты дарят на Рождество, Рождество - холодно, где холодно - на Северном полюсе.
Поцоны айда на Северный полюс!!!"
SmackMyBitchUp 27.07.2012 01:28 # 0
TarasB 23.07.2012 13:50 # 0
Я в этой теме виртуалов не применял и тебе минусы не ставил.
Fai 23.07.2012 13:52 # 0
TarasB 23.07.2012 14:00 # 0
Как ведёт себя сишка, не знаю.
defecate-plusplus 23.07.2012 14:17 # +1
прокомментируй, пожалуйста, результат паскалевской киллир-фичи "tagged variant record" http://ideone.com/nr9m1 - она же сама должна проверять, к какому полю я имею право обращаться, а к какому нет
или вот еще fpc, не то, что крестоговно - отличный образчик надежного компилятора, построенного по утвержденному международному стандарту: http://ideone.com/IjNdV
USB 23.07.2012 14:23 # +2
Лол, ты тугой штоле? Это не tagged variant record.
Пользователь USB получает предупреждение, за нарушение правила 2.2.1 данного сайта.
USB 23.07.2012 14:28 # +2
Пользователь USB получает бан до 25.07.2012, за обсуждения действий модератора.
SmackMyBitchUp 24.07.2012 08:58 # +8
defecate-plusplus 23.07.2012 14:29 # +2
TarasB 24.07.2012 10:07 # +1
Приводя пример надёжных проверяемых tagged unions, позволяющих запихивать неподы в ветки и с корректным поведением неподов, я всегда говорил про Аду.
eth0 23.07.2012 14:23 # 0
Я исправляю ситуацию по мере сил, но их не хватает.
vistefan 24.07.2012 09:41 # +2
Есть ещё версия, что Тарас локаничен и короток в своих ответах вроде:
> ты хуй
а вы постоянно цитируете стандарт, @defecate++, а бывает и на буржуйском наречии, что минурастов приводит в ступор, заставляя активно минусовать.
SmackMyBitchUp 24.07.2012 09:57 # +1
vistefan 24.07.2012 10:00 # +3
Fai 24.07.2012 11:10 # +1
TarasB 24.07.2012 11:16 # +1
absolut 24.07.2012 11:42 # +3
Fai 24.07.2012 11:56 # +1
vistefan 26.07.2012 19:47 # 0
sayidandrtfm 22.07.2012 14:59 # +3
kipar 23.07.2012 13:01 # +1
Fai 22.07.2012 12:00 # +4
И да, он знает где ты живешь.
USB 22.07.2012 12:05 # 0
Fai 22.07.2012 12:08 # +7
И НЕ ЗЛИ МЕНЯ БОЛЬШЕ!!!
USB 22.07.2012 12:11 # +2
Хомячков злить не опасно.
>и он знает где ты живешь.
и он не знает где я живу!
Fai 22.07.2012 12:21 # +2
Xom94ok 22.07.2012 14:28 # +12
sayidandrtfm 22.07.2012 14:15 # +6
У меня для вас плохие новости. (с)
bormand 22.07.2012 15:54 # +6
> namespace std { ... }
Зачем срешь не в свой неймспейс?
> const Tifon&swap (Tifon& a, Tifon& b) {
Зачем swap возвращает значение?
> }catch(...){//try restore
Что там за конструктор копирования такой, что надо обрабатывать брошенные из него исключения? И самое забавное - ну вот выкинул тот конструктор исключение, присваивание откатило объект обратно, вся логика алгоритмов, выполняемых над этим классом пошла под откос. Нахуй так жить...
Начальник прав. Код полное говно.
sayidandrtfm 22.07.2012 16:04 # +2
https://ru.wikipedia.org/wiki/Тифон
bormand 22.07.2012 16:37 # +2
Тогда уж. Раз такая надежность нужна.
USB 22.07.2012 17:44 # −1
sayidandrtfm 22.07.2012 17:55 # +4
rat4 22.07.2012 17:58 # +7
Найти инъекцию и выполнить
bormand 22.07.2012 20:35 # +4
USB 22.07.2012 23:49 # −5
Fai 22.07.2012 23:53 # +1
Хочешь пирожок?
USB 23.07.2012 00:34 # −7
zasedanie 23.07.2012 01:12 # −1
anonimb84a2f6fd141 23.07.2012 01:34 # −7
USB 23.07.2012 01:52 # −7
bormand 23.07.2012 05:34 # +5
Всю жизнь ты будешь скрываться, и бояться что инфа о тебе проскочит в интернет... Будешь по 10 раз перепроверять каждое отправляемое сообщение... По ночам ты не сможешь спать, просыпаясь от страшных снов, про то как ГК узнал кто ты и рассказал начальнику... Совесть будет грызть тебя. И, став 80летним параноиком ты придешь к начальнику, и все ему расскажешь.
Fai 23.07.2012 10:45 # +3
Присылайте и дальше нам свои работы.
SmackMyBitchUp 23.07.2012 12:54 # +3
ну и нахуй вы нам тут не нужны
bormand 23.07.2012 15:02 # +4
Кто все эти люди?
SmackMyBitchUp 23.07.2012 15:13 # 0
roman-kashitsyn 23.07.2012 15:13 # +6
SmackMyBitchUp 23.07.2012 15:17 # +2
roman-kashitsyn 23.07.2012 15:55 # +2
Fai 22.07.2012 16:40 # +2