考虑以下程序:
#include <iostream>
struct X {
X () = default;
X (X &) { std::cout << "non-const called" << std::endl; }
X (X const &) { std::cout << "const called" << std::endl; }
int i () const { return 7; }
};
auto f () {
X x;
auto lambda = [=]() { return x.i(); };
return lambda;
}
int main()
{
auto lambda = f();
std::cout << lambda () << std::endl;
return 0;
}
使用 VC++15,我得到了输出
const called
const called
7
使用 Clang 3.9,我得到了
non-const called
7
这里哪个编译器是正确的?
最佳答案
我会说clang是对的。
当 lambda 捕获 x
并且返回值的构造函数被优化出来时,最适合的构造函数只被调用一次。
这就是为什么你只获得一个 non-const called。
关于c++ - VC++ 15 为 lambda 捕获调用了错误的复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950203/