次のコードがあります。
class MyClass
{
static constexpr bool foo() { return true; }
void bar() noexcept(foo()) { }
};
sincefoo()
は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; }
^
それで...これは2パスコンパイルの問題ですか?コンパイラーがクラス内のすべてのメンバー関数を定義する前に宣言しようとしているという問題はありますか? (クラスのコンテキストの外では、どちらのコンパイラもエラーをスローしないことに注意してください。) これには驚きました。static constexpr
直感的には、クラスの内外を問わず、すべての定数式でメンバー関数を使用できない理由がわかりません。