В Herb Sutter CppCon 2014 поговорим Назад к основам: Современный стиль С++ он ссылается на слайд 28 (веб-копию слайдов здесь) к этому шаблону:
class employee {
std::string name_;
public:
void set_name(std::string name) noexcept { name_ = std::move(name); }
};
Он говорит, что это проблематично, потому что при вызове set_name() с временной, noexcept-ness не сильно (он использует фразу "noexcept-ish" ).
Теперь я использовал приведенный выше шаблон довольно сильно в своем собственном недавнем коде на С++, главным образом потому, что он сохраняет меня, набирая две копии set_name() каждый раз - да, я знаю, что это может быть немного неэффективно, заставляя построить копию каждый раз, но эй, я ленивый типер. Однако фраза Herb "Это noexcept проблематична" меня беспокоит, так как проблема здесь не решена: std::string оператор переадресации переносится noexcept, как и его деструктор, поэтому set_name() выше кажется мне гарантированным noexcept. Я вижу потенциальный выброс исключения компилятором перед set_name() по мере того, как он подготавливает параметр, но я изо всех сил стараюсь увидеть это как проблематичное.
Позже на слайде 32 Herb ясно заявляет, что это анти-шаблон. Может кто-нибудь объяснить мне, почему я не писал плохой код, будучи ленивым?