Доступ к статическому члену constexpr из переменной-члена, ошибка GCC? - PullRequest
3 голосов
/ 11 марта 2019

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

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 не дает ошибок. Сравните два компилятора ,

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

1 Ответ

3 голосов
/ 11 марта 2019

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

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

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