1

考虑这段代码:

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当定义是 with(...)而不是时,它只抱怨一个参数(auto&&...)

4

1 回答 1

3

前半部分是对auto&&...旧 GCC 版本中泛型 lambda 的错误解析:clang vs gcc - empty generic lambda variadic argument pack非捕获通用 lambda 是否应该衰减为函数指针?; 非捕获通用 lambda 是否应该衰减为函数指针?

预计下半年。传递 C 风格的...可变参数会生成一个副本,并且您删除了复制构造函数。

于 2018-09-27T08:37:42.953 回答