Вопрос в прокомментированных строках в приведенном ниже коде:

struct MemberType
{
    int test;
};

struct MyTag
{
    MemberType non_static_m;// Note that it's NOT defined with 'static'.
};

int main(void)
{
    typedef decltype(MyTag::non_static_m) TestType_Good;// Well-formed in C++11.
    typedef decltype(MyTag::non_static_m.test) TestType_1;// Is it right or wrong?
    typedef decltype(MyTag::non_static_m.test + 1) TestType_2;// Is it right or wrong?

    return 0;
}

Обратите внимание, что член MyTag - нестатическое поле. Буду признателен за внесение соответствующих пунктов в стандартные документы ISO.

3
unituniverse 21 Апр 2014 в 09:59

2 ответа

Лучший ответ

Это действительно так. В неоцененных операндах (decltype, sizeof среди других) вы можете именовать нестатические элементы данных без объектного выражения в произвольных подвыражениях. Обратите внимание, что это не относится к нестатическим функциям-членам, а только к элементам данных.

3
Johannes Schaub - litb 21 Апр 2014 в 10:00

Вы можете использовать decltype в любом допустимом выражении C ++, поэтому ваши 3 утверждения верны (это не имеет ничего общего со статическими или нестатическими модификаторами).

В разделе 7.1.6.2 стандарта говорится:

Тип, обозначенный decltype (e), определяется следующим образом:

  • если e - это выражение id без скобок или доступ к члену класса без скобок (5.2.5), decltype (e) - это тип сущности, названной e. Если такой сущности нет или если e называет набор перегруженных функций, программа сформирована неправильно;
  • в противном случае, если e - значение x, decltype (e) - это T &&, где T - это тип e;
  • в противном случае, если e - это lvalue, decltype (e) - это T &, где T - это тип e;
  • в противном случае decltype (e) - это тип e.

Стандартные справочные материалы см. В FAQ по stroustrup здесь

1
quantdev 21 Апр 2014 в 08:53