2

在下面的代码示例中,我希望输出如下,因为x它是一个static constexpr变量。

5
5
5
5

但是,当我使用 编译时,g++ 警告我x在 lambda 函数内部未初始化-Wall,并且输出的最后三行有所不同,可能是因为正在打印堆栈上未初始化内存的值。这是程序在使用 options 编译时产生的一种可能的输出-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

这确实是一个编译器错误。我在这里报道过,前段时间得到了证实。它不会在旧版本的 g++ 上崩溃,因为 constexpr 关键字只是被解析和忽略。

于 2012-02-15T15:02:36.667 回答
0

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

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 回答