“自动”可以用作C++中lambda参数的子类型吗?
autoGCC 接受作为 lambda 参数类型的一部分的C++ 代码,例如:
#include <vector>
#include <iostream>
int main()
{
auto make_vector = []( std::initializer_list<auto> v )
{ return std::vector<typename decltype(v)::value_type>{v}; };
auto v = make_vector( {1,2} );
std::cout << v[0] << ' ' << v[1] << 'n';
}
https://gcc.godbolt.org/z/z43bEjMc9
这里是参数类型std::initializer_list<auto>,有时真的很方便。但其他编译器抱怨:
模板参数不能是包含“auto”的类型
它是该语言的仅 GCC 扩展还是其他编译器中也会出现的新 C++ 功能?如果是第一种情况,那么如何将其关闭以最大化语言一致性?
回答
看起来这是GCC 中的一个错误。尽管它说它已在您使用的 GCC 版本中解决...
你可以在这里阅读更多关于为什么你不能auto在这种情况下使用的信息。
有人正确地向我指出这种情况是针对函数参数的。在 C++20 中仍然不允许,请参阅此答案。
- 我报告了 GCC 错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101498
回答
这不是声明泛型 lambdas的有效方法。[dcl.spec.auto.general]/2 :
甲占位符型说明符形式的类型约束选择
auto可以被用作一个DECL说明符的的DECL说明符-SEQ一个的参数声明函数声明或λ-表达,如果它不是auto类型-说明符引入后返回型(见下文),是一种通用的参数类型占位符的函数声明或λ-表达。
请注意,这std::initializer_list<auto>不是类型约束opt 的形式auto。
从 C++20 开始,您可以为泛型 lambdas定义模板参数列表。例如
auto make_vector = []<typename T>( std::initializer_list<T> v )
{ return std::vector<typename decltype(v)::value_type>{v}; };