A minimally interesting typo-bug
I just ran into some code like this in a test suite:
struct MoveOnlyWidget {
MoveOnlyWidget(int);
MoveOnlyWidget(const MoveOnlyWidget&) = delete;
MoveOnlyWidget(MoveOnlyWidget&&) = default;
MoveOnlyWidget& operator=(const MoveOnlyWidget&) = delete;
MoveOnlyWidget& operator=(MoveOnlyWidget&&) = default;
MoveOnlyWidget() = default;
};
I suspect that the original author intended that last line
to have a ~
in front of MoveOnlyWidget
— this type ends up
being default-constructible when maybe it wasn’t intended to be.
It occurs to me that it would be neat if something like PVS-Studio gave a warning for a defaulted default constructor that wasn’t at the top of the class — or maybe any constructor that wasn’t grouped with the other constructors of the class. (Maybe PVS-Studio already does! I don’t know.)
Anyway, if it really mattered that MoveOnlyWidget
shouldn’t
be default-constructible, the original author could have
enforced that by adding any one of these lines after the class’s
closing brace:
static_assert(!std::is_constructible_v<MoveOnlyWidget>);
static_assert(!std::is_default_constructible_v<MoveOnlyWidget>);
static_assert(!std::default_initializable<MoveOnlyWidget>);