Доступ к статическому члену constexpr из переменной-члена, ошибка GCC?

Следующее компилируется без ошибок:

template<int j, int i>
struct TemplateClass { 
    int arr[i];
};
struct A {
    inline static constexpr int n = 123; 
};
template<int j> struct B {
    void func() {
        A a;
        TemplateClass<j, a.n> c;
    }
};
int main() {
  B<456> b;
  b.func();
}

Однако при компиляции с помощью GCC мы получаем ошибку "использование 'this' в постоянном выражении", если мы делаем переменную-член переменной A a в функции func, как это:

template<int j> struct B {
    A a;
    void func() {
        TemplateClass<j, a.n> c;
    }
};

Компиляция с помощью MSVC не дает ошибок. Сравните два компилятора,

  • Я не понимаю, почему это дает ошибку. Это ошибка?
  • Есть ли способ обойти эту ошибку?

person Carucel    schedule 11.03.2019    source источник
comment
IIRC об этом спросили на прошлой неделе. Я постараюсь найти его. Я считаю, что это предмет отчета о дефекте.   -  person NathanOliver    schedule 11.03.2019
comment
Обходной путь - просто использовать A::n?   -  person Fantastic Mr Fox    schedule 11.03.2019
comment
@FantasticMrFox, да, это работает! decltype(a)::n тоже работает.   -  person Carucel    schedule 11.03.2019
comment
related/dupe: stackoverflow.com/questions/ 44995196/   -  person NathanOliver    schedule 11.03.2019


Ответы (1)


ГЦК правильный. Аргумент шаблона должен быть константным выражением, а a.n неявно означает this->a.n, поскольку a является членом окружающего класса. Но вычисление константного выражения не может получить доступ к this внутри функции-члена, отличной от constexpr ([expr.const]/2.1). И хотя вычисление this кажется ненужным для получения значения статического члена n, стандарт требует, чтобы a (что означает this->a) оценивалось, даже если его значение не требуется; см. [expr.ref]/1 и сноску к нему.

GCC примет ваш код, если func помечен как constexpr. Однако, как указано в комментариях, лучше просто написать A::n.

person Brian Bi    schedule 11.03.2019
comment
Так что это несоответствие MSVC ... Не то, что я ожидал. - person Fantastic Mr Fox; 11.03.2019