相关疑难解决方法(0)

c ++语法:默认和删除修饰符

今天我偶然发现了一个像这样的代码片段:

class A 
{
    A() = default;
    A (const A&) = delete; 

    ...
}
Run Code Online (Sandbox Code Playgroud)

我从未见过deletedefault关键字.它们是C++ 11标准的一部分吗?它们用于什么?

c++ c++11

9
推荐指数
1
解决办法
1228
查看次数

c ++ 11如何实现"... = default;" 对于三种方法的规则

当我学习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++ canonical-form c++11

7
推荐指数
1
解决办法
409
查看次数

删除复制构造函数和operator =类范围访问

在旧版本的C++如果有人想阻止copying一个类的对象,他们通常会宣布Copy Constructoroperator=()一类这样的民营部分:

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)

c++ copy-constructor

1
推荐指数
1
解决办法
60
查看次数

标签 统计

c++ ×3

c++11 ×2

canonical-form ×1

copy-constructor ×1