不实现和删除普通运营商有什么区别?

Rak*_*111 9 c++ c++11

假设我有一堂课

class Object
{
public:
    Object(int i) : num(i) {};

    int getNum() const { return num; }
private:
    int num;
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试这样做

Object obj{ 1 };
Object obj2{ 2 };
Object obj3 = obj + obj2; //This is wrong
Run Code Online (Sandbox Code Playgroud)

这是非法的:'Object' does not define this operator or a conversion to a type acceptable to the predefined operator.

Object operator+(const Object&) = delete;除了错误消息之外,添加并没有真正改变任何东西:'Object Object::operator +(const Object &)': attempting to reference a deleted function.

是否delete只有具有隐式声明的运算符(如赋值运算符和复制/移动构造函数)或在我的情况下是否更改了其他内容?

Nic*_*las 8

只有具有隐式声明的运算符(如赋值运算符和复制/移动构造函数)才需要删除,还是在我的情况下更改其他任何内容?

不,不.你的情况太简单了,任何这种差异都无关紧要.

= delete 有两个目的:

1:强制删除(可能)否则存在的功能.即,特殊成员的职能.

2:它指定不能调用具有该签名的函数.这基本上是#1的概括.

后者的典型例子是防止函数参数的隐式转换.如果你这样做:

void foo(float val);
void foo(int) = delete;
Run Code Online (Sandbox Code Playgroud)

你不能再打电话了foo(5); 你必须使用foo(5.f).为什么?因为编译器将看到第二个重载,看到它与调用最匹配,然后立即失败,因为该函数被删除.

这有时也是这样做的:

void foo(float val);
template<typename T> void foo(T&&) = delete;
Run Code Online (Sandbox Code Playgroud)

这可以确保您只能使用实际调用它float.没有可隐式转换的类型float将起作用.