2

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;
}
4

2 に答える 2

2

これは確かにコンパイラのバグでした。ここで報告しましたが、少し前に確認しました。constexprキーワードは解析されて無視されるため、古いバージョンのg++ではクラッシュしません。

于 2012-02-15T15:02:36.667 に答える
0

xラムダのキャプチャリストでキャプチャする必要があります。

std::for_each(arr, arr + 3, [&](int i) { // notice the & (capture the outside env
                                         // by reference
    std::cout << x << std::endl;
});
于 2012-01-28T03:03:07.017 に答える