Size: a a a

2020 May 01

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Constantine Drozdov
представим код
void f(int x) {
  if (x % 2) ++x;
  //теперь x это четное число
}
Даже при переполнении работает
источник

v

vehlwn in pro.cxx
Mikhail Matrosov
да можно было без проблем сделать другую реализацию для кастомного делитера
Специализация шаред птра для массивов смеется над тобой.
источник

CD

Constantine Drozdov in pro.cxx
конструктор unique_ptr(unique_ptr&& from) гарантированно оставляет nullptr в поле from и никак не прописывает это в типе
соответственно, невозможно реализовать перегрузку деструктора для unique_ptr
источник

MM

Mikhail Matrosov in pro.cxx
Constantine Drozdov
конструктор unique_ptr(unique_ptr&& from) гарантированно оставляет nullptr в поле from и никак не прописывает это в типе
соответственно, невозможно реализовать перегрузку деструктора для unique_ptr
ну, на уровне типов - да. но блин. там же логика простейшая. и компилятор её всю видит. я удивлён, что он всё не оптимизировал в ноль
источник

MM

Mikhail Matrosov in pro.cxx
vehlwn
В смысле условный delete? Он по стандарту обязан ничего не делать, если получил nullptr.
ха. прикольно. по ходу не важно, делаешь ты проверку или нет :)
https://gcc.godbolt.org/z/qws3Em
источник

v

vehlwn in pro.cxx
Встроенный delete обязан проверять. А деструктор уник птра тоже.
Effects: If get() == nullptr there are no effects. Otherwise get_deleter()(get()).
источник

MM

Mikhail Matrosov in pro.cxx
vehlwn
Встроенный delete обязан проверять. А деструктор уник птра тоже.
Effects: If get() == nullptr there are no effects. Otherwise get_deleter()(get()).
"тоже" -> "нет"?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
vehlwn
Встроенный delete обязан проверять. А деструктор уник птра тоже.
Effects: If get() == nullptr there are no effects. Otherwise get_deleter()(get()).
Кастомный удалятор не обязан, потому что он не вызывается с нуллптр
источник

MM

Mikhail Matrosov in pro.cxx
Alex
он имеет в виду вызов деструктора для by value параметра внутри функции
ага. кажется что-то проясняется. там этот момент обсуждается в вопросах после доклада. оказывается, удалением аргументов занимается вызывающая сторона. Что на самом деле логично, если подумать о том, что только она может создать аргументы. Т.е. в данном случае вызывающая функция обязана удалить юникптр, который был передан в функцию, и она не знает, что с ним происходило в вызываемой функции. он мог обнулиться, а мог и нет. поэтому она обязана проверить. у меня в голове была другая абстрактная модель, в соответствии с которой освобождением параметров занимается вызываемая функция. по ходу, эта модель в данном случае не описывает наблюдаемое поведение.
источник

A

Alex in pro.cxx
хм, я тоже предполагал, что раз копия аргумента локальная для функции, то и удалиться он должен при выходе из функции (на вызываемой стороне)
источник

MM

Mikhail Matrosov in pro.cxx
ох с++. пишешь на нём 12 лет, а он всегда найдёт, чем тебя удивить. казалось бы даже в таких простых вещах
источник

v

vehlwn in pro.cxx
Artöm Bakri Al-Sarmini
Кастомный удалятор не обязан, потому что он не вызывается с нуллптр
Да. Я говорил про Effects.
источник

AZ

Alexander Zaitsev in pro.cxx
идти в @supapro
источник

М

Макс in pro.cxx
Спасибо
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Кроме static_assert есть примеры declaration, которые ничего не декларируют?
источник

A

Alex in pro.cxx
а почему это static_assert считается declaration?
источник

O

Ofee in pro.cxx
Artöm Bakri Al-Sarmini
Кроме static_assert есть примеры declaration, которые ничего не декларируют?
int; считается? Clang буквально так и жалуется:
>> warning: declaration does not declare anything
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alex
а почему это static_assert считается declaration?
Так сделали, чтобы его можно было писать в любом скоупе
источник

A

Alex in pro.cxx
есть всякие std::declval, но это функция, а не декларация. А static_assert, наверное, оператор
источник

A

Alex in pro.cxx
хм, он реально считается декларацией? Интересно
источник