У меня есть следующий код:
class MyClass
{
static constexpr bool foo() { return true; }
void bar() noexcept(foo()) { }
};
Я бы ожидал, что поскольку foo()
является функцией static constexpr
, и поскольку он определен до объявления bar
, это было бы вполне приемлемо.
Однако g++
дает мне следующую ошибку:
error: ‘static constexpr bool MyClass::foo()’ called in a constant expression
Это... менее полезно, так как возможность вызова функции в постоянном выражении является всей точкой constexpr
.
clang++
немного полезнее. В дополнение к сообщению об ошибке, в котором утверждается, что аргумент noexcept
должен быть постоянным выражением, он говорит:
note: undefined function 'foo' cannot be used in a constant expression
note: declared here
static constexpr bool foo() { return true; }
^
Итак... это проблема с двумя проходами? Проблема в том, что компилятор пытается объявить все функции-члены в классе до того, как какой-либо из них будет определен? (Обратите внимание, что вне контекста класса ни один компилятор не выдает ошибку.) Это меня удивляет; интуитивно, я не вижу причин, по которым функции-члены static constexpr
не могут использоваться в любых и всех постоянных выражениях внутри класса или вне.