web-dev-qa-db-ja.com

MSVC ++ 11が関数のconstexpr修飾を拒否するのはなぜですか?

したがって、constexprをいじってみると、MSVC(Visual Studio 2012)は、この単純なプログラム(省略を含む)を使用してconstexprキーワードで関数を修飾しようとしたときに、エラーを出しました。

_constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n-1));
}

int main(void)
{
    const int fact_three = factorial(3);
    std::cout << fact_three << std::endl;
    return 0;
}
_

constexprには、次のメッセージで赤の下線が引かれました。

エラー:この宣言にはストレージクラスまたは型指定子がありません

プログラムをコンパイルしようとすると、次の出力が得られました。

1> main.cpp(5):エラーC2144:構文エラー:「int」の前に「;」を付ける必要があります

1> main.cpp(5):エラーC4430:型指定子がありません-intと見なされます。注:C++はdefault-intをサポートしていません

Cppreference constexprの使用法を説明するために使用 のまさにその例であるため、私は本当に困惑します。最初は、リテラルを返す単純な関数、つまりconstexpr int func(){return 5;}を使用しましたが、同じエラーが発生しました。最初のメッセージを「構造体またはクラスのメンバー関数である必要があります」と解釈しましたが、Cppreferenceの例は、明らかに必要ではないことを示しています。

それで、私は明らかにここで何が欠けていますか?

38
JBL

簡単に言うと、VisualStudioはconstexprをサポートしていないためです( Visual Studio 2015 より前)。

MSVC++ 11はVisualStudio2012であることに注意してください。 VC++ 10はVisualStudio2010です。

38
Chowlett