我有一个类,我需要隐式转换为一些具有中间值的东西,例如。
struct outer {
struct inner {
operator T() { return T(); }
};
operator inner() { return inner(); }
};
如果我有这种结构,总是有效,例如
void f(T t);
outer o;
f(o);
答案 0 :(得分:9)
§13.3.3.1.2 [over.ics.user] p1
用户定义的转换序列包括初始标准转换序列,然后是用户定义转换(12.3),然后是第二个标准转换序列。
注意单词“sequence”的单数和缺失。在隐式转换序列中,只会考虑一个用户定义的转换。
答案 1 :(得分:0)
这有效:
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
没有超载,所以它不是真正的解决方案。