C++20から、仮想関数にconstexpr
を指定することができるようになりました。
そこで、constexpr virtual
関数を使ってコードを書いていたのですが、gccとclangではコンパイルが通るのに、MSVCではコンパイルエラーになるという現象に悩まされていました。色々と検証した結果、constexpr virtual
関数からメンバ変数にアクセスするとMSVCでだけ定数として評価できないようです。
再現コードは以下になります。
struct base
{
constexpr virtual int value() const = 0;
};
struct derived : public base
{
constexpr int value() const override { return m_val;}
int m_val = 42;
};
Visual StudioのDeveloper Communityで検索した結果、これは報告済みのバグで、現在(2024/9/18)でも修正されていません。
上記のDeveloper Communityにもあるように、関数ポインタを通して呼び出すことによって、constexpr
関数を使うことができるのですが、煩雑極まりないので早く修正されてほしいです。