How to: accidentally break empty base optimization
Published on the
Topics: i-hate-c++
A reasonably common idiom in C++ code is the use of the following or similar class to inhibit move and copy operations, to avoid having to repeat the four delete
d functions in every class:
C++
class noncopyable {
public:
noncopyable(const noncopyable&) = delete;
noncopyable(noncopyable&&) = delete;
noncopyable& operator=(const noncopyable&) = delete;
noncopyable& operator=(noncopyable&&) = delete;
protected:
noncopyable() = default;
~noncopyable() = default;
};
I'm personally not a huge fan of the noncopyable
name, because it describes how instead of why, but that's neither here nor there.
The noncopyable
class can be mixed in using inheritance, like so:
C++
class foo : private noncopyable {
// …
};
So far, so good, but there's more to it than meets the eye.
Read the full article…