Есть ли ограничения на типы в операторе типов? - PullRequest
5 голосов
/ 05 февраля 2012

Мне было интересно, знает ли кто-нибудь, какие ограничения существуют для оператора преобразования / преобразования типа?

Так, например, у меня могут быть следующие операторы переопределения:

class Test {
    operator int() { return 0; };
    operator int*() { return nullptr; };
}

Дляобычная функция, у меня также может быть указатель на тип массива.Например,

int (*MyFunc())[4] { return nullptr; };

Однако я не знаю, как сделать то же самое для оператора преобразования (или если это даже законно).Я пробовал несколько разных вариантов и VS2010 и ни одна не работает.(Например:)

operator int (*())[4] { return nullptr; };
operator int(*)[4]() { return nullptr; };

Я не уверен, является ли это ограничением в VS2010 или существует общее ограничение на типы, которые могут использоваться в операторе преобразования.Я попытался найти стандартный онлайн без удачи.Кто-нибудь знает?Прежде чем кто-либо спросит «зачем вам это делать», он предназначен для автоматически сгенерированного кода.Хотя я не ожидаю получения указателя на вход массива, я хотел бы иметь возможность создавать код, если он допустим в C ++.

Ответы [ 2 ]

6 голосов
/ 05 февраля 2012

Вы должны в основном использовать typedef в сложных конструкциях, также у вас неправильный синтаксис,

operator Type () {}

Я собираюсь использовать typedef s, хотя

typedef int (*foo())[4];
typedef int(*bar)[4];

с использованием typedef

operator foo() { return nullptr; } // здесь вы пытаетесь преобразовать nullptr в «функцию» , которая возвращает указатель на массив из 4 int, что, очевидно, неверно.

operator bar() { return nullptr; } // ваше второе преобразование действительно, так как вы конвертируете nullptr в указатель в массив из 4 int s

3 голосов
/ 05 февраля 2012

Да, есть ограничения.Ограничение, которое вы ударили по массивам, связано с грамматикой языка.Грамматическая спецификация для оператора преобразования (и kin) выглядит следующим образом:

§12.3.2
conversion-function-id:
    operator conversion-type-id
conversion-type-id:
    type-specifier-seq conversion-declarator[opt]
conversion-declarator:
    ptr-operator conversion-declarator[opt]

§7.1.6
type-specifier:
    trailing-type-specifier
    class-specifier
    enum-specifier
trailing-type-specifier:
    simple-type-specifier
    elaborated-type-specifier
    typename-specifier
    cv-qualifier
type-specifier-seq:
    type-specifier attribute-specifier-seq[opt]
    type-specifier type-specifier-seq
trailing-type-specifier-seq:
    trailing-type-specifier attribute-specifier-seq[opt]
    trailing-type-specifier trailing-type-specifier-seq

Я оставляю читателю в качестве упражнения просмотр всех этих функций, но вы не можете указать массив в качестве типанепосредственно.(Это указывается только в объявлений .) К счастью, разрешено использование typedef-имени (через спецификатор typename), а так как typedef является своего рода объявлением, там работают массивы:

struct Test {
    typedef int operator_type[4];

    operator operator_type*() { return nullptr; };
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...