Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Цепочка операторов неявного преобразования

Автор вопроса: PuppyОтветов: 2

У меня есть класс, который мне нужно неявно преобразовать в несколько вещей с промежуточными значениями, например.

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

Если у меня есть эта структура, допустимо ли это всегда, например

void f(T t);
outer o;
f(o);
  • Что такое T? Тип шаблона? Mooing Duck 23.12.2011
  • @MooingDuck: тип. Неважно, что такое Т. Это не шаблон, потому что я не брал никаких параметров? Puppy 23.12.2011
  • f(o) потребуются два определяемых пользователем преобразования, в то время как стандарт допускает максимальное стандартное преобразование -> преобразование u-d -> стандартное преобразование. Gene Bushuyev 23.12.2011
  • Компилятор автоматически выполнит только одно неявное преобразование. Обычно неявных преобразований лучше избегать - они усложняют понимание и сопровождение кода. mark 23.12.2011

c++c++11implicit-conversion

Ответы

Ответ 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 не перегружен, так что это не совсем решение.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы