VC ++ 15为lambda捕获调用错误的拷贝构造函数?

时间:2016-12-03 16:57:49

标签: c++ visual-c++ lambda clang copy-constructor

考虑以下计划:

#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

这里的编译器是正确的吗?

1 个答案:

答案 0 :(得分:2)

我会说铿锵是对的 当lambda捕获x并且返回值的构造函数被优化时,最适合的构造函数只被调用一次。
这就是为什么你只获得一个名为的非const的原因。

有关copy-elision和RVO的详细信息,请参阅herehere