“自动”可以用作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}; };


以上是“自动”可以用作C++中lambda参数的子类型吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>