Size: a a a

cxx.Дискуссионная

2020 April 18

RM

Roy Mustang in cxx.Дискуссионная
или хотя бы чтоб компилятор ругался
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Roy Mustang
Должен ли я помечать функции использующие внутри себя семантику перемещений, как noexcept, если я уверен, что методы внутри функции не вызываются исключение? (Прочитал что от этого зависит оптимизация)
Ну и ты учти, что спецификатор noexcept — часть ABI метода
источник

RM

Roy Mustang in cxx.Дискуссионная
А то UB + std::terminate такое себе
источник

O

Ofee in cxx.Дискуссионная
Roy Mustang
А почему бы не сделать так чтоб функция помеченная как noexcept компилятором автоматом отбрасывалась если эта функция вызывает функции, которые могут бросить исключение?
А откуда компилятору знать, что там вызывается?
источник

O

Ofee in cxx.Дискуссионная
Roy Mustang
А то UB + std::terminate такое себе
Не используй исключения
источник

O

Ofee in cxx.Дискуссионная
Дефолтные конструкторы тоже не считаетает?
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Roy Mustang
А почему бы не сделать так чтоб функция помеченная как noexcept компилятором автоматом отбрасывалась если эта функция вызывает функции, которые могут бросить исключение?
Эм, каким образом компилятор это будет проверять? А если ты вызываешь функцию из другого translation unit или вообще из другой динамической либы?
источник

RM

Roy Mustang in cxx.Дискуссионная
Ofee
Вот используется у тебя семантика перемещений и все конструкторы перемещения noexcept. А однажды ты решаешь реализовать в конструкторе перемещения одного из классов нетривиальную логику и позволяешь ему кидать исключения. Ты, конечно же, сразу вспомнишь все методы, полагающиеся на этот конструктор и пойдёшь с них снимать noexcept?
Почему снимать а не ставить?
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
И там вообще старый легаси-код на С?
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Roy Mustang
А почему бы не сделать так чтоб функция помеченная как noexcept компилятором автоматом отбрасывалась если эта функция вызывает функции, которые могут бросить исключение?
Если ты ставишь noexcept, то ты и отвечаешь за то, что ты в этом уверен
источник

RM

Roy Mustang in cxx.Дискуссионная
Ofee
Не используй исключения
Да я и не использую
источник

O

Ofee in cxx.Дискуссионная
Roy Mustang
Почему снимать а не ставить?
Потому что был noexcept метод, который вызывался, а потом стал не-noexcept, но его другие noexcept функции всё ещё вызывают. А он уже не noexcept
источник

RM

Roy Mustang in cxx.Дискуссионная
/dev/urandon ¯\_(ツ)_/¯
Если ты ставишь noexcept, то ты и отвечаешь за то, что ты в этом уверен
Ну это же лишь на вызов метода распространяется а не на весь класс
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Roy Mustang
А почему бы не сделать так чтоб функция помеченная как noexcept компилятором автоматом отбрасывалась если эта функция вызывает функции, которые могут бросить исключение?
И что значит "функция отбрасывалась"?
источник

RM

Roy Mustang in cxx.Дискуссионная
Ofee
Потому что был noexcept метод, который вызывался, а потом стал не-noexcept, но его другие noexcept функции всё ещё вызывают. А он уже не noexcept
Так разве noexcept распространяется на весь класс? Там же какой метод пометишь
источник

O

Ofee in cxx.Дискуссионная
Спасибо, думал имелось ввиду, что не вычисляет даже
источник

O

Ofee in cxx.Дискуссионная
Roy Mustang
Так разве noexcept распространяется на весь класс? Там же какой метод пометишь
У тебя метод может вызвать другой метод?
источник

RM

Roy Mustang in cxx.Дискуссионная
Ofee
У тебя метод может вызвать другой метод?
Это то понятно, если метод noexcept может вызвать другой метод, который не noexcept - это понятное дело
источник

RM

Roy Mustang in cxx.Дискуссионная
Все что помечено не как noexcept являются функциями, которые бросают исключения да?
источник

RM

Roy Mustang in cxx.Дискуссионная
То есть, все что не noexcept - это except методы (могут бросать исключения)?
источник