gpt4 book ai didi

c++ - 隐式定义的用户转换运算符支持的操作

转载 作者:行者123 更新时间:2023-12-03 06:57:52 24 4
gpt4 key购买 nike

我目前正在学习给定类的隐式定义的转换运算符(也称为用户定义的转换)如何工作。在我的特殊情况下,我想测试我的类以隐式转换为默认的整数类型。以下是我的代码段。

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

class A {
public:
A(int);
operator int() const;
protected:
int value;
};

A::A(int input) : value(input) {
}

A::operator int() const {
return this->value;
}

int main() {
A foo = 1;
foo = foo + 1; // no error
foo = foo * 1; // no error
foo = foo / 1; // no error
cout << foo << endl; // no error
!foo; // no error
&foo; // no error
foo%1; // no error
foo != 1; // no error
foo == 1; // no error
foo >= 1; // no error
foo <= 1; // no error
foo < 1; // no error
foo > 1; // no error
foo && 1; // no error
foo || 1; // no error
A *boo = &foo; // no error
*boo = 5; // no error
cin >> foo; // error
foo *= 2; // error
foo++; // error
return 0;
}
如您所见,这些运算符没有提供任何错误,但是 >>*=++产生了错误;也就是说,对于这些运算符,不会隐式转换A类的对象。我注意到它没有为类似的赋值运算符转换。有人可以解释为什么会这样吗,以及隐式用户转换支持的运算符是什么?

最佳答案

这些运算符:

cin >> foo;  // >> endl is a bug     
foo *= 2;
foo++;
只能在l值上调用。您的转换运算符返回一个临时的 int,它不是l值。同样,您的运算符是 const限定符,这意味着只能在 const A实例上调用它。
您需要提供一个转换运算符,该运算符返回如下的l值:
class A {
public:
operator int&();
// ...
};

A::operator int&() {
return this->value;
}
请注意,如果您希望该运算符返回可修改的左值,则不能为 const
这是 demo

关于c++ - 隐式定义的用户转换运算符支持的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63874607/

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