是否需要重载类的强制转换操作符?



我目前正在计划一个类与一些转换功能。我只是想知道什么时候必须重载类的强制转换操作符。当我有一个转换构造函数A(B& b)时,就我所见,每当我需要将B转换为a时,我可以使用转换构造函数。

例子:

B b, c, d;
A a = b; // conversion constructor automatically called
a = A(c); // could also overload assignment operator
function_of_a((A)d); // can equally write this as function_of_a(A(d))

目前我计划只使用转换构造函数,而我没有看到重载强制转换操作符的任何目的,我还计划故意不重载a = B的赋值操作符,以使转换在代码中更明显。

如果要转换为原语或无法访问的类型(例如,operator bool()operator std::string()),显然必须编写强制转换操作符。

除此之外,这主要是一个界面设计问题。转换构造函数是目标类型接口的一部分。强制转换操作符是源类型接口的一部分。您需要决定转换应该属于哪个接口。

例如,假设您有一个fancy_string类,以及其他十几个可以转换为fancy_string以生成fancy_string表示的类。fancy_string应该包含所有这些类的转换构造函数吗?可能不会。这将使fancy_string依赖于所有这些类,并且每次添加一个应该转换为fancy_string的类时,您也必须更改fancy_string。这是个糟糕的设计。在这些类中提供强制转换操作符会好得多,因为转换到fancy_string的能力应该是这些类的接口的一部分,而不是fancy_string