классы, похоже, имеют проблемы с вызовом их функций-членов 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 - спасибо за любую помощь!