gpt4 book ai didi

c++ - 不实现和删除常用运算符有什么区别?

转载 作者:可可西里 更新时间:2023-11-01 16:37:26 24 4
gpt4 key购买 nike

假设我有一个类

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

int getNum() const { return num; }
private:
int num;
};

现在,如果我尝试这样做

Object obj{ 1 };
Object obj2{ 2 };
Object obj3 = obj + obj2; //This is wrong

这是非法的:“Object”未定义此运算符或到预定义运算符可接受的类型的转换

添加 Object operator+(const Object&) = delete; 并没有真正改变任何东西,除了错误消息:'Object Object::operator +(const Object &)':试图引用已删除的函数

delete 是否只有具有隐式声明的运算符(如赋值运算符和复制/移动构造函数)才需要,或者它是否改变了我的情况?

最佳答案

Is the delete only needed for operators that have an implicit declaration (like assignment operator and copy/move constructor) or does it change anything else in my case?

没有也没有。您的情况太简单了,任何此类差异都无关紧要。

= delete 有两个目的:

1:它强行删除(可能)存在的函数。即特殊成员函数。

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

后者的原型(prototype)示例是为了防止函数参数的隐式转换。如果你这样做:

void foo(float val);
void foo(int) = delete;

您不能再调用foo(5);你必须使用 foo(5.f)。为什么?因为编译器会看到第二次重载,看到它最匹配调用,然后立即失败,因为函数被删除。

有时也这样做:

void foo(float val);
template<typename T> void foo(T&&) = delete;

这确保您只能使用实际的float 调用它。任何可从 float 隐式转换的类型都不起作用。

关于c++ - 不实现和删除常用运算符有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36243194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com