Ich sehe keinen Dokumentationsvorteil:
#include <boost/noncopyable.hpp>
struct A
: private boost::noncopyable
{
};
vs:
struct A
{
A(const A&) = delete;
A& operator=(const A&) = delete;
};
Wenn Sie Nur-Verschieben-Typen hinzufügen, sehe ich die Dokumentation sogar als irreführend an. Die folgenden zwei Beispiele sind nicht kopierbar, obwohl sie beweglich sind:
#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;
};
Bei Mehrfachvererbung kann es sogar zu einer Platzstrafe kommen:
#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';
}
Für mich druckt dies aus:
3
Aber das, von dem ich glaube, dass es eine überlegene Dokumentation hat:
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';
}
Ausgänge:
2
Ich finde es viel einfacher, meine Kopiervorgänge zu deklarieren, als zu überlegen, ob ich boost::non_copyable
mehrmals davon abgeleitet bin oder nicht und ob mich das kosten wird. Vor allem, wenn ich nicht der Autor der vollständigen Vererbungshierarchie bin.
struct Foo{Foo(const Foo&)=delete;};