ten*_*our 64 c++ boost noncopyable
为了防止复制类,您可以非常轻松地声明私有复制构造函数/赋值运算符.但你也可以继承boost::noncopyable
.
在这种情况下使用boost有什么优点/缺点?
How*_*ant 47
我看不到文档的好处:
#include <boost/noncopyable.hpp>
struct A
: private boost::noncopyable
{
};
Run Code Online (Sandbox Code Playgroud)
VS:
struct A
{
A(const A&) = delete;
A& operator=(const A&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
当您添加仅移动类型时,我甚至认为文档具有误导性.以下两个示例不可复制,但它们是可移动的:
#include <boost/noncopyable.hpp>
struct A
: private boost::noncopyable
{
A(A&&) = default;
A& operator=(A&&) = default;
};
Run Code Online (Sandbox Code Playgroud)
VS:
struct A
{
A(A&&) = default;
A& operator=(A&&) = default;
};
Run Code Online (Sandbox Code Playgroud)
在多重继承下,甚至可能存在空间损失:
#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';
}
Run Code Online (Sandbox Code Playgroud)
对我来说这打印出来:
3
Run Code Online (Sandbox Code Playgroud)
但是,我认为这有更好的文档:
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';
}
Run Code Online (Sandbox Code Playgroud)
输出:
2
Run Code Online (Sandbox Code Playgroud)
我发现声明我的复制操作要比判断我是否boost::non_copyable
多次派生以及是否会让我付出代价要容易得多.特别是如果我不是完整继承层次结构的作者.
Naw*_*waz 42
它使得intent 明确而清晰,否则必须看到类的定义,并搜索与copy-semantic相关的声明,然后查找声明它的access-specifier,以确定是否class是不可复制的.通过编写需要启用了复制语义的代码来发现它的其他方法,并查看编译错误.
ten*_*our 41
总结别人说的话:
boost::noncopyable
过度私有复制方法的优点:
noncopyable
.私有复制方法的优点boost::noncopyable
:
thi*_*ton 16
ans*_*gri 16
我无法理解为什么没有其他人似乎提到它,但是:
随着noncopyable
你写你的类的名称一次.
没有,五倍重复:一个用于'A类',两个用于禁用赋值,两个用于禁用复制构造函数.
引用文档:
"处理这些问题的传统方法是声明私有拷贝构造函数和拷贝赋值,然后记录为什么要这样做.但是从noncopyable派生更简单,更清晰,并且不需要额外的文档."
http://www.boost.org/libs/utility/utility.htm#Class_noncopyable
一个具体的优点(除了更清楚地表达你的意图)是错误将在编译阶段而不是链接阶段更快地被捕获,如果成员或朋友函数试图复制对象.基类构造函数/赋值在任何地方都不可访问,从而产生编译错误.
它还可以防止您意外地定义函数(即键入{}
而不是;
),这是一个很小的错误,可能会被忽视,但会允许成员和朋友制作对象的无效副本.
归档时间: |
|
查看次数: |
33290 次 |
最近记录: |