標準の C++11 のみを使用:
namespace g{ int x; }
constexpr int foo()
{
//return g::x = 42; Nah, not constant
return 42; // OK
}
int main()
{}
別の例を次に示します。
constexpr int foo( int blah = 0 )
{
return blah + 42; // OK
}
int main( int argc, char** )
{
int bah[foo(2)]; // Very constant.
int const troll = foo( argc ); // Very non-constant.
}
GCC の意味は__attribute__( const )
、GNU コンパイラ ドキュメントに次のように記載されています。
多くの関数は、引数以外の値を調べず、戻り値以外には何の効果もありません。pure
関数はグローバル メモリの読み取りを許可されていないため、基本的に、これは以下の属性よりもわずかに厳密なクラスです。
これは、関数の結果が引数のみに依存する必要があり、関数に副作用があってはならないことを意味すると解釈される場合があります。
これにより、 C++11 よりも一般的な関数のクラスが可能にconstexpr
なり、関数が になり、inline
引数と関数の結果がリテラル型に制限され、関数本体の「アクティブな」ステートメントが単一のreturn
ステートメントに制限されます。ここで、(C++11 §7.1.5/3)
— 戻り値の初期化に使用されるすべてのコンストラクター呼び出しと暗黙の変換 (6.6.3、8.5) は、定数式 (5.19) で許可されているもののうちの 1 つでなければなりません。
例として、関数を作成することは困難です (不可能ではないと思いますが、難しいと思います) constexpr
sin
。
しかし、結果の純度は 2 つの当事者にのみ関係します。
そのため、eg の純粋性をsin
言語で表現する方法を探す代わりに、マクロによるコード生成を避け、純粋な関数をそのように文書化することをお勧めします。
そしてconstexpr
、実際に可能な関数に使用してください (残念ながら、2012 年 12 月現在、最新の Visual C++ コンパイラはまだサポートしていませんconstexpr
)。
pureとの関係constexpr
については、以前の SO の質問があります。主に、すべてのconstexpr
関数はpureですが、その逆ではありません。