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

标签 c++ casting overloading

如果我正在重载类型转换运算符,当需要隐式转换但找不到时,我会遇到编译错误。考虑一个简单的示例,其中我有一个包含类型(在本例中为 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 值为零的整数文字是异常(exception)。

关于c++类型转换运算符重载和隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28307887/

相关文章:

java - ConstraintLayout 无法转换为 android.widget.TextView

c++ - 运算符过载测试失败

c++ - C++中一个奇怪的语法不是operator==

java - 如何判断向下转型在 Java 中是否合法?

c++ - 命名空间、函数模板和静态数据的作用域困境

c++ - 在 C++ 中转换为 void* 和 typedef

C++基于派生类的重载方法

c++ - 使用 std::function 时编译器无法推断类型

c++ - 你会用 <regex> 实现一个轻量级的 XML 解析器吗?

c++ - 当从函数调用传递值时,std::tie 失败并返回 "cannot bind non-const lvalue reference"