今天我偶然发现了一个像这样的代码片段:
class A
{
A() = default;
A (const A&) = delete;
...
}
Run Code Online (Sandbox Code Playgroud)
我从未见过delete或default关键字.它们是C++ 11标准的一部分吗?它们用于什么?
当我学习C++时,人们告诉我要始终至少实施三种方法的规则.
现在我看到新的"... =默认;" 从堆栈溢出的c ++ 0x开始,我的问题是:
是否为这些方法定义了c ++ 11标准实现,还是编译器特定的?
加上我想有一些准确性:
- 在代码方面,实现是什么样的?(如果它是通用的)
- 与我下面的示例实现相比,这是否有优势?
- 如果你不使用赋值/复制构造函数,那么
*... = delete*做什么呢,将它们声明为私有有什么区别?回答(来自@ 40two)- 新的默认值=与旧的默认实现不同吗?
免责声明:当我在我的方法中需要更多高级功能时,我肯定会自己实现它们.但是我习惯于实现赋值运算符和复制构造函数,即使我从未使用它们,只是为了编译器不这样做.
我曾经做过:(编辑,@Drrmmr 交换/移动)
//File T.h
class T
{
public:
T(void);
T(const T &other);
T(const T &&other);
T &operator=(T other);
friend void swap(T &first, T &second);
~T(void);
protected:
int *_param;
};
//File T.cpp
T::T(void) :
_param(std::null)
{}
T::T(T &other)
: _param(other._param)
{}
T::T(T &&other)
: T()
{
swap(*this, other);
}
T &T::operator=(T other)
{
swap(*this, other);
return …Run Code Online (Sandbox Code Playgroud) 在旧版本的C++如果有人想阻止copying一个类的对象,他们通常会宣布Copy Constructor和operator=()一类这样的民营部分:
class Foo {
public:
Foo(){} // Default
~Foo(){} // Default
private:
Foo( const Foo& c ); // not implemented
Foo& operator=( const Foo& c ); // not implemented
};
Run Code Online (Sandbox Code Playgroud)
这很直截了当.现在有了更新版本的C++,我们现在可以做到这一点.
class Foo {
public:
Foo() = default;
~Foo() = default;
private:
Foo( const Foo& c ) = delete;
Foo& operator=( const Foo& c ) = delete;
};
Run Code Online (Sandbox Code Playgroud)
我的问题就变成了这样:用现代方法将这些声明为deleted函数,如果它们是在类的公共部分,受保护部分或私有部分中定义的,那么它是否重要或有什么不同?
例如,上面的一个和这个有什么区别:
class Foo {
public:
Foo() = default;
~Foo() = default;
Foo( …Run Code Online (Sandbox Code Playgroud)