Подтвердить что ты не робот

С++ 11 - объявление нестатических данных как "авто"

Разрешает ли С++ 11 объявлять нестатические члены данных как "автоматически", если они инициализированы в объявлении? Например:

struct S
{
    auto x = 5;  // in place of 'int x = 5;', which is definitely allowed
};

GCC 4.7 отклоняет вышеуказанный код, в то время как он принимает int x = 5;.

Предполагая, что это не ошибка компилятора, но стандарт действительно не позволяет этого, почему бы и нет? Это было бы так же полезно, как объявление локальных переменных auto.

4b9b3361

Ответ 1

Правило для запрещения нестатических элементов приведено в пункте 7.1.6.4:

Автотип-спецификатор может также использоваться при объявлении переменной в условие оператора выбора (6.4) или оператора итерации (6.5), в типе-спецификаторе-seq в идентификаторе нового типа или типе-идентификатора new-expression (5.3.4), в декларации для диапазона и в объявлении статический член данных с помощью элемента привязки или равенства, который появляется в спецификации элемента определения класса (9.4.2).

Я нашел обоснование того, что это статический здесь, который отражает то, как Джеймс Макнеллис объясняет это в комментарии.

Один национальный орган не любит, если автопилот-спецификатор без статики. По электронной почте авторам:

    template< class T >
    struct MyType : T {
      auto data = func();
      static const size_t erm = sizeof(data);
    };

Чтобы определить макет X, теперь мы имеем двухфазное имя и ADL. Обратите внимание, что func может быть либо типом, либо функцией; он может быть найден в T, пространстве имен MyType, связанного пространства имен T при создании экземпляра, глобальное пространство имен, анонимное пространство имен или любые пространства имен, подлежащие использованию директивы use. С осторожностью мы могли бы бросить некоторый поиск concept_map для удачи. В зависимости от порядка включения заголовка я мог бы даже получить разные результаты для ADL и нарушить одно правило определения, которое не требуется диагностировать.

Из-за этого спора авторы больше не предлагают, чтобы авто допускается для нестатических элементов данных.

Итак, в основном в зависимости от порядка включения заголовка, тип data может быть очень различным. Конечно, auto x = 5; не нужно было бы зависеть от поиска по 2-фазному имени или ADL, однако я предполагаю, что они сделали это "одеяло", потому что в противном случае им пришлось бы составлять индивидуальные правила для каждого варианта использования что сделало бы вещи очень сложными.

В той же статье автор предлагает устранить это ограничение, однако, похоже, это предложение было отклонено, вероятно, из-за вышеупомянутого обоснования, а также для того, чтобы ожидаемое поведение могло быть таким же, независимо от того, что инициализатор.