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

Joh*_*hnB 13 c++ lambda clang copy-constructor visual-c++

考虑以下程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用VC++ 15,我得到了输出

const called
const called
7
Run Code Online (Sandbox Code Playgroud)

有了Clang 3.9,我明白了

non-const called
7
Run Code Online (Sandbox Code Playgroud)

哪个编译器在这里正确?

sky*_*ack 2

我想说 clang 是对的。
当 lambda 捕获x并且返回值的构造函数被优化时,最适合的构造函数仅被调用一次。
这就是为什么您只获得一个名为 的非常量


有关复制省略和 RVO 的更多详细信息,请参阅此处此处。