c++ - Constexpr 变量在 Lambda 内部显示为未初始化

标签 c++ lambda c++11 constexpr

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

5
5
5
5

但是,当我使用 -Wall 编译时,g++ 警告我 x 在 lambda 函数中未初始化,并且输出的最后三行不同,大概是因为正在打印堆栈上未初始化内存的值。这是程序在使用选项 -Wall -std=c++0x 编译时可能产生的一种输出。为什么输出不是我期望的那样?

5
32718
32718
32718

如果有帮助,当在声明 constexpr T x 中删除 constexpr 时会产生预期的输出。

示例程序

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

最佳答案

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

关于c++ - Constexpr 变量在 Lambda 内部显示为未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9042556/

相关文章:

c++ - 如何锐化 rnd 生成器

c# - 使用泛型的列的最大值

C++11 在 switch case 中混合枚举类和 unsigned int 将无法编译

C++11:boost::make_tuple 与 std::make_tuple 有何不同?

C++ 临时 - "pure virtual method called"

c++ - 从包含打破其他先前包含定义

C++ 编写内联函数作为参数传递

python - Python 中的条件全局 Lambda

c++ - 使用原子指令确保映射访问安全,是否可以使用 2 个不同的原子指令重新排序?

c++ - 在 C++ 中创建自己的错误处理机制