小编den*_*s95的帖子

始终使用构造函数而不是显式转换运算符

我有以下课程:

template <typename T1>
class Foo {
public:
    Foo(T1* obj) : obj(obj) {}

    template <typename T2>
    Foo(const Foo<T2>& other) : obj(other.obj) {}

    template <typename T2>
    explicit operator Foo<T2>() {
        return Foo<T2>(static_cast<T2*>(obj));
    }
    T1* obj;
};
Run Code Online (Sandbox Code Playgroud)

第二个构造的目的是,从隐式转换Foo<X>Foo<Y>允许当且仅当的隐式转换从X*Y*被允许。

转换运算符在那里允许显式转换 from Foo<X>toFoo<Y>使用显式转换 from X*to Y*

但我注意到转换运算符从未被使用过。即使我进行显式转换,编译器也始终使用第二个构造函数。如果底层类型的隐式转换是不可能的,这会导致错误。

下面的代码可以用来测试上面的类。

class X {};
class Y : public X {};

int main() {
    Y obj;
    Foo<Y> y(&obj);
    Foo<X> x = y; // implicit cast …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading type-conversion

5
推荐指数
1
解决办法
830
查看次数