Я пытаюсь как можно ближе подойти к гарантии Strong Exception, но, играя с std::move_if_noexcept
, я столкнулся с каким-то странным поведением.
Несмотря на то, что оператор move-assign в следующем классе помечен как noexcept
, оператор присваивания копии вызывается при вызове с возвращаемым значением рассматриваемой функции.
struct A {
A () { /* ... */ }
A (A const&) { /* ... */ }
A& operator= (A const&) noexcept { log ("copy-assign"); return *this; }
A& operator= (A&&) noexcept { log ("move-assign"); return *this; }
static void log (char const * msg) {
std::cerr << msg << "\n";
}
};
int main () {
A x, y;
x = std::move_if_noexcept (y); // prints "copy-assign"
}
Вопрос
- Почему оператор переноса не вызван в предыдущем фрагменте?