したがって、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の例は、明らかに必要ではないことを示しています。
それで、私は明らかにここで何が欠けていますか?
簡単に言うと、VisualStudioはconstexpr
をサポートしていないためです( Visual Studio 2015 より前)。
MSVC++ 11はVisualStudio2012であることに注意してください。 VC++ 10はVisualStudio2010です。