c++ - 将参数传递给通用 lambda 时复制构造函数不正确

标签 c++ gcc c++17 auto generic-lambda

考虑这段代码:

template < auto What >
constexpr auto Identity = [](auto&&...) { return What; };

struct Ban
{
  Ban() = default;
  Ban(const Ban&  ban) = delete;
  Ban(      Ban&& ban) = delete;
};

int main()
{ 
  Ban ban;
  Identity<false>(10,ban);

  return 0;
}

编译失败 godbolt.org使用 gcc-7.3,因为它试图复制 Identity 的第二个参数。为什么它应该?这是 gcc 中的错误吗?

gcc 不会在第二个参数是临时参数或只有一个参数时提示。当 Identity 的定义是使用 (...) 而不是 (auto&&...) 时,它只会提示一个参数。

最佳答案

前半部分是对旧 GCC 版本中通用 lambda 的 auto&&... 的错误解析:clang vs gcc - empty generic lambda variadic argument pack ; Should non-capturing generic lambdas decay to function pointers? ; Should non-capturing generic lambdas decay to function pointers?

预计下半年。传递 C 风格的 ... 可变参数生成一个拷贝,你删除了你的复制构造函数。

关于c++ - 将参数传递给通用 lambda 时复制构造函数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52532279/

相关文章:

c++ - 使用未声明的标识符 C++

gcc - Ubuntu (12.10) 和 GCC 4.7/4.8 有什么问题?

c++ - 优化弱符号查找

c++ - 通过引用传递 std::string_view

C++17 cout中的折叠表达式

c++ - 服务器端如何使用mtrace

c++ - 计算飞行距离的程序

c++ - 为什么 std::numeric_limits<SomeStruct>::infinity() "work"?

C++/GCC - 文件范围对象的构造函数没有被调用

c++ - 关于在模板中使用可变参数的逻辑运算符