隐式定义的用户转换运算符支持的操作
Supported Operations for Implicitly Defined User Conversion Operators
我目前正在学习隐式定义的转换运算符(也称为用户定义的转换)如何为给定的 class 工作。在我的特定情况下,我想测试我的 class 是否隐式转换为默认整数类型。下面是我的代码片段。
#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;
}
如您所见,这些运算符没有提供任何错误,但 >>
、*=
和 ++
会产生错误;即 class A 的对象不会为这些运算符隐式转换。我注意到它没有为类似的赋值运算符转换。谁能解释为什么会这样,以及隐式用户转换支持的运算符是什么?
这些运算符:
cin >> foo; // >> endl is a bug
foo *= 2;
foo++;
只能在 l-value 上调用。您的转换运算符 return 是一个临时 int
,而不是 l-value。此外,您的操作员是 const
合格的,这意味着它只能在 const A
个实例上调用。
您需要提供一个 return 是 l-value 的转换运算符,如下所示:
class A {
public:
operator int&();
// ...
};
A::operator int&() {
return this->value;
}
请注意,如果您希望此运算符成为 return 可修改的 l-value.
,则该运算符不能是 const
这里是 demo。
我目前正在学习隐式定义的转换运算符(也称为用户定义的转换)如何为给定的 class 工作。在我的特定情况下,我想测试我的 class 是否隐式转换为默认整数类型。下面是我的代码片段。
#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;
}
如您所见,这些运算符没有提供任何错误,但 >>
、*=
和 ++
会产生错误;即 class A 的对象不会为这些运算符隐式转换。我注意到它没有为类似的赋值运算符转换。谁能解释为什么会这样,以及隐式用户转换支持的运算符是什么?
这些运算符:
cin >> foo; // >> endl is a bug
foo *= 2;
foo++;
只能在 l-value 上调用。您的转换运算符 return 是一个临时 int
,而不是 l-value。此外,您的操作员是 const
合格的,这意味着它只能在 const A
个实例上调用。
您需要提供一个 return 是 l-value 的转换运算符,如下所示:
class A {
public:
operator int&();
// ...
};
A::operator int&() {
return this->value;
}
请注意,如果您希望此运算符成为 return 可修改的 l-value.
,则该运算符不能是const
这里是 demo。