链接隐式转换操作符

Chaining implicit conversion operators

本文关键字:操作符 转换 链接      更新时间:2023-10-16

我有一个类,我需要隐式转换为一些东西,中间值,例如

struct outer {
    struct inner {
        operator T() { return T(); }
    };
    operator inner() { return inner(); }
};

如果我有这个结构,是否总是有效,例如

void f(T t);
outer o;
f(o);

§13.3.3.1.2 [over.ics.user] p1

一个用户定义的转换序列由一个初始标准转换序列后面跟着、一个用户定义的转换(12.3)后面跟着第二个标准转换序列组成。

注意单数和"sequence"这个词的缺失。在隐式转换序列中,只考虑一个用户定义的转换。

这行得通:

struct Foo {}; // renamed T in Foo to avoid confusion!
struct outer {
        struct inner {
                operator Foo() { return Foo(); }
        };
        operator inner() { return inner(); }
        template <typename T>
        operator T () {
                return operator inner();
        }
};
int main() {
        void f(Foo t);
        outer o;
        f(o);
}

但仅仅因为f没有过载,所以它不是一个真正的解决方案。