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

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