Constexpr变量出现未初始化的Lambda内部

时间:2012-01-28 02:56:58

标签: c++ lambda c++11 constexpr

在下面的代码示例中,我希望输出如下,因为xstatic constexpr变量。

5
5
5
5

然而,g ++警告我,x在使用-Wall编译时在lambda函数中未初始化,并且输出的最后三行不同,可能是因为堆栈上未初始化的内存的值正在印刷。以下是程序在使用选项-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;
}

2 个答案:

答案 0 :(得分:2)

这确实是编译器错误。我报告了它here,它刚刚被证实。它不会在旧版本的g ++上崩溃,因为constexpr关键字只是被解析并被忽略。

答案 1 :(得分:0)

您必须在lambda的捕获列表中捕获x

std::for_each(arr, arr + 3, [&](int i) { // notice the & (capture the outside env
                                         // by reference
    std::cout << x << std::endl;
});