c++ - VC++ 15 为 lambda 捕获调用了错误的复制构造函数?

标签 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

这里哪个编译器是正确的?

最佳答案

我会说clang是对的。
当 lambda 捕获 x 并且返回值的构造函数被优化出来时,最适合的构造函数只被调用一次。
这就是为什么你只获得一个 non-const called


herehere有关复制省略和 RVO 的更多详细信息。

关于c++ - VC++ 15 为 lambda 捕获调用了错误的复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950203/

相关文章:

c++ - if 语句中的相等比较

c++ - bool 和 sizeof 条件模板

c++ - 无法理解部分代码(位操作)

c++ - 具有枚举规范的模板模板类在 MSVC++ 编译器 : C3201 上失败

visual-studio - 在 Visual Studio 中的单个构建操作中构建项目的多个配置

visual-c++ - fatal error LNK1112 : module machine type 'X86' conflicts with target machine type 'AMD64'

c++ - 如何使可变 lambda 捕获列表的某些成员成为 const?

c++ - 将 Stack.top() 添加到 vector 中?

java - 将 if-else 转换为 lambda 表达式

java - 如何将 forEach 与 slf4j.logger.info 一起使用