Я не вижу никакой выгоды от документации:
#include <boost/noncopyable.hpp>
struct A
: private boost::noncopyable
{
};
против:
struct A
{
A(const A&) = delete;
A& operator=(const A&) = delete;
};
Когда вы добавляете типы только для перемещения, я даже считаю документацию вводящей в заблуждение.Следующие два примера не могут быть скопированы, хотя они являются подвижными:
#include <boost/noncopyable.hpp>
struct A
: private boost::noncopyable
{
A(A&&) = default;
A& operator=(A&&) = default;
};
vs:
struct A
{
A(A&&) = default;
A& operator=(A&&) = default;
};
При множественном наследовании может быть даже штраф за пробел:
#include <boost/noncopyable.hpp>
struct A
: private boost::noncopyable
{
};
struct B
: public A
{
B();
B(const B&);
B& operator=(const B&);
};
struct C
: public A
{
};
struct D
: public B,
public C,
private boost::noncopyable
{
};
#include <iostream>
int main()
{
std::cout << sizeof(D) << '\n';
}
Для меня это печатает:
3
Но вот что, я считаю, имеет превосходную документацию:
struct A
{
A(const A&) = delete;
A& operator=(const A&) = delete;
};
struct B
: public A
{
B();
B(const B&);
B& operator=(const B&);
};
struct C
: public A
{
C(const C&) = delete;
C& operator=(const C&) = delete;
};
struct D
: public B,
public C
{
D(const D&) = delete;
D& operator=(const D&) = delete;
};
#include <iostream>
int main()
{
std::cout << sizeof(D) << '\n';
}
Выходы:
2
Мне гораздо проще объявить свои операции копирования, чем рассуждать, получаю ли я несколько раз boost::non_copyable
и будет ли это стоить мне.Особенно, если я не являюсь автором полной иерархии наследования.