c++ - 为什么 C++20 模板 lambda 使用 typename 关键字?

标签 c++ typename c++20 generic-lambda

我理解一致性论点,但模板的大部分参数都是类型,所以我觉得既然 lambda 是定义结构的简洁方式,它可能应该默认为 typename/class(您仍然需要编写 int/size_t/short)。

如果有人不熟悉 C++20 中对 lambda 的更改,请看这里的示例:

[]<typename T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};

我的问题是为什么不:

[]<T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};

最佳答案

问题是这个已经有一个意思:

template <T> void foo();

它是一个带有一个模板参数的函数模板,该模板参数是一个类型为T非类型模板参数,并且该模板参数没有名称。

如果相同的语法根据您引入的是函数模板还是通用 lambda 而意味着非常不同的东西,那将会非常困惑 - 也就是说,两个非常相似的上下文服务于相似的目的!

然后...如果您真的想要一个非类型模板参数,您会怎么做?就不能拥有一个吗?

关于c++ - 为什么 C++20 模板 lambda 使用 typename 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56491931/

相关文章:

c++ - 确定模板中模板参数的类型

c++ - 用于检查所有模板参数类型是否唯一的编译时 C++ 函数

c++ - Boost asio C++ 20 协程 : co_spawn a coroutine with a by-reference parameter unexpected result

c++ - 优雅地检查 std::find "not found"条件

c++ - 修改结构后应用程序崩溃

c++ - 不能在复制构造函数中隐式调用的方法

c++ - 使用 STL 声明多个客户端函数

c++ - 如何使用 CMake 在我的项目中正确链接我的库?

c++ - 使用 std::remove_pointer 等操作在模板中构建派生类型

c++ - 自引用 C++20 概念