C++ 隐式转换与泛函算子

C++ 隐式转换与泛函算子,c++,implicit-conversion,C++,Implicit Conversion,我正在学习函数运算符,不明白为什么要编译这样的代码片段: class Pocket { int value; public: Pocket(int value) :value(value) {} int getValue() const { return value; } operator int() const { return value; } bool operator<(cons

我正在学习函数运算符,不明白为什么要编译这样的代码片段:

class Pocket
{
    int value;
public:
    Pocket(int value) :value(value) {}
    int getValue() const
    {
        return value;
    }
    operator int() const
    {
        return value;
    }
    bool operator<(const Pocket & _Right) const
    {
        return value < _Right.value;
    }
};

int main() {
    Pocket mynumbers1[] = { 3, 9, 2, -4, 4 };
    Pocket mynumbers2[] = { 3, 9, 5, 0, 4 };
    vector<Pocket> v1(mynumbers1, mynumbers1 + 5);
    vector<Pocket> v2(mynumbers2, mynumbers2 + 5);
    vector<Pocket> v3(5, 0);
    transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), minus<Pocket>());
    return 0;
}
类口袋
{
int值;
公众:
口袋(int值):值(value){}
int getValue()常量
{
返回值;
}
运算符int()常量
{
返回值;
}

bool运算符用户定义的转换函数,可在代码中进行以下初始化:

Pocket mynumbers1[] = { 3, 9, 2, -4, 4 };
Pocket mynumbers2[] = { 3, 9, 5, 0, 4 };
当将
减号应用于给定范围时,编译器也将在
转换
调用中使用:

transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), minus<Pocket>());
transform(v1.begin()、v1.end()、v2.begin()、v3.begin()、减号());
如果要删除
运算符int()const
转换函数,则初始化和转换都不起作用

但是,如果要使转换函数显式化,它可以用于初始化,但不能用于转换。请参见演示

本标准的相关章节:

15.3.2转换函数[class.conv.fct]

2.转换函数可以是显式的,在这种情况下,它仅被视为用于直接初始化的用户定义转换。否则,用户定义转换不限于在赋值和初始化中使用


编译器将使用
Pocket
的显式cast运算符推断出
minus()
的可能转换。您从哪里收集到的用户定义转换将不会起作用?“以及到
int
的转换,这两个参数的类型相同,因此不应考虑。”这句话很不清楚,你能详细解释一下为什么你认为这应该适用吗?你的推理不正确-编译器将使用你指定的用户定义转换。为了证明这一点,请从
Pocket
类中删除
运算符int
-你将看到代码不再编译。