У меня есть класс, который мне нужно неявно преобразовать в несколько вещей с промежуточными значениями, например.
struct outer {
struct inner {
operator T() { return T(); }
};
operator inner() { return inner(); }
};
Если у меня есть эта структура, допустимо ли это всегда, например
void f(T t);
outer o;
f(o);
Ответ 1 · рейтинг 11 · Xeo
§13.3.3.1.2 [over.ics.user] p1
Определяемая пользователем последовательность преобразования состоит из исходной стандартной последовательности преобразования, за которой следует определяемое пользователем преобразование (12.3), за которой следует вторая стандартная последовательность преобразования.
Обратите внимание на единственное число и отсутствие слова "последовательность". Во время последовательности неявных преобразований будет учитываться только одно определяемое пользователем преобразование.
Ответ 2 · curiousguy
Это работает:
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 не перегружен, так что это не совсем решение.