在下面的代码示例中,我希望输出如下,因为x
是static 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;
}
答案 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;
});