我有一个类需要进行一些隐式转换,包括中间值的转换,例如:
struct outer {
struct inner {
operator T() { return T(); }
};
operator inner() { return inner(); }
};
如果我有这个结构,那么是否总是有效的呢?例如:
void f(T t);
outer o;
f(o);
我有一个类需要进行一些隐式转换,包括中间值的转换,例如:
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)和第二个标准转换序列组成。
请注意,只会在隐式转换序列中考虑一个用户定义的转换函数。
T
的最终副本复制到类型为 T
的参数中。 - Johannes Schaub - litb这个是有效的:
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
没有重载,所以这并不是一个真正的解决方案。
Foo
运算符。 - Puppy
T
是什么?一个模板类型吗? - Mooing Duckf(o)
需要进行两次用户定义转换。请注意,翻译过程中不能改变原文意思。 - Gene Bushuyev