c类型转换运算符重载和隐式转换

如果我正在重载类型转换操作符,当需要隐式转换并且找不到一个时,我遇到了编译错误.考虑一个简单的例子,我有一个包含类型的包装类(在这种情况下是一个long long):

class my_wrapper
{
    long long state;

public:
    my_wrapper(long long _in) : state(_in) {}

    my_wrapper& operator=(const long long rhs)
    {
        state = rhs;
        return *this;
    }

    operator long long()
    {
        return state;
    }
};

现在的问题是,如果我想将代码转换为其他东西(例如,void * …假设我在64位上),如果没有指定两个强制转换,则以下内容不起作用:

my_wrapper x1 = my_wrapper(5ll);
void* i1 = (void *) x1; // Compile Error: no suitable conversion function exists
void* i1 = (void *) (long long) x1; // Works

如果我写了类似的东西:

long long i1 = 5ll;
void* i2 = (void *) i1; // Works

没什么大不了的,但只是好奇是否可以指定“operator long long()”如果没有其他转换就应该用作默认值.

最佳答案 [over.match.conv] /(1.1):

The conversion functions of S and its base classes are considered.
Those non-explicit conversion functions that are not hidden within S
and yield type T or a type that can be converted to type T via a
standard conversion sequence (13.3.3.1.1)
are candidate functions.

从积分类型到void * 1没有标准转换序列,因此转换运算符不是候选者.

您可以尝试转换运算符模板:

template <typename T>
operator T()
{
    return T(state);
}

1值为零的整数文字是例外.

点赞