假设我有一堂课
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只有具有隐式声明的运算符(如赋值运算符和复制/移动构造函数)或在我的情况下是否更改了其他内容?
只有具有隐式声明的运算符(如赋值运算符和复制/移动构造函数)才需要删除,还是在我的情况下更改其他任何内容?
不,不.你的情况太简单了,任何这种差异都无关紧要.
= 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将起作用.