x
以下のコードサンプルでは、はstatic constexpr
変数であるため、出力は次のようになると予想されます。
5
5
5
5
x
ただし、g ++は、を使用してコンパイルすると、ラムダ関数内で初期化されていないことを警告し-Wall
ます。おそらく、スタック上の初期化されていないメモリの値が出力されているため、出力の最後の3行が異なります。これは、オプションを使用してコンパイルされたときにプログラムによって生成される可能性のある出力の1つ-Wall -std=c++0x
です。出力が期待したものではないのはなぜですか?
5
32718
32718
32718
それが役立つ場合constexpr
は、宣言でが削除されたときに期待される出力が生成されconstexpr T x
ます。
サンプルプログラム
#include <algorithm>
#include <iostream>
struct _foo
{
template <class T>
struct traits
{
static constexpr T val = 5;
};
template <class T>
constexpr T getval() const { return traits<T>::val; }
} foo;
struct _test
{
template <class T>
void bar(const T& t)
{
int arr[] = { 1, 2, 3 };
constexpr T x = foo.getval<T>();
std::cout << x << std::endl;
std::for_each(arr, arr + 3, [&](int i) {
std::cout << x << std::endl;
});
}
} test;
int main()
{
test.bar(5u);
return 0;
}