Как предоставление класса шаблона решает недопустимые зависимости constexpr?C ++ - PullRequest
0 голосов
/ 05 декабря 2018

классы, похоже, имеют проблемы с вызовом их функций-членов constexpr в другом контексте constexpr.Например, в этом фрагменте кода, который я предложил в предыдущем вопросе , можно увидеть это поведение:

struct Foo {
    constexpr static bool TRUE() {
        return true;
    }
    static_assert(Foo::TRUE(), ""); //ERROR
};

Поскольку static_assert зависит от Foo::TRUE(), компиляция не удалась, поскольку Foo::TRUE() еще не полностью решен в этом контексте.


Так как же добавление одного шаблона в Foo решает всю проблему?

template<int x>
struct Foo {
    constexpr static bool TRUE() {
        return true;
    }
    static_assert(Foo::TRUE(), ""); //compiles fine
};

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

Кроме того, всегда должно быть одинаково много TRUE() -функций и static_assert -вызовов, поскольку существует Foo<> классов, поэтому при компиляции должна возникать та же проблема зависимости.


Я пользуюсь Visual Studio 17 Community версии 15.9.0 - спасибо за любую помощь!

1 Ответ

0 голосов
/ 05 декабря 2018

Это CWG 1626 :

В стандарте должно быть ясно, что функция-член constexpr не может использоваться в константном выражении, пока ее класс не будет завершен.Например:

template<typename T> struct C {
  template<typename T2> static constexpr bool _S_chk() {
    return false;
  }
  static const bool __value = _S_chk<int>();
}; 

C<double> c;

Текущие реализации принимают это, хотя они отклоняют соответствующий случай без шаблона:

struct C {
  static constexpr bool _S_chk() { return false; }
  static const bool __value = _S_chk();
};

C c; 

Предположительно, случай шаблона должен обрабатываться согласованно с регистром без шаблона.

...