考虑一下这段代码:
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-7.3
Identity
gcc
合同通用条款 如果第二个参数是临时的或只有一个参数,则不抱怨。当定义 是与 (...) 而不是 (auto&&...) .
合同通用条款
(...)
(auto&&...)
前半部分是对 auto&&... clang vs gcc - empty generic lambda variadic argument pack ; Should non-capturing generic lambdas decay to function pointers?
auto&&...
预计下半年。超越C型 ... variadics创建了一个副本,而您删除了副本构造函数。
...