gpt4 book ai didi

c++ - 模板化 lambda 中的所有 lambda 是否也是模板化 lambda?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:53 29 4
gpt4 key购买 nike

考虑这段代码(在 GCC 和 MSVC 上编译):

int main()
{
auto foo = [](auto p){
typedef decltype(p) p_t;
auto bar = [](){
return static_cast<p_t>(10);
};
return bar();
};

std::cout << foo(0ull) << std::endl;
}

foo() 是一个模板化的 lambda,因为它有一个 auto 参数。但是要让 bar() 知道 p_t 类型,它也必须以某种方式隐式模板化,这让我想到了标题中的问题:

模板 lambda 中的所有 lambda 是否也是模板 lambda?

如果是这样的话,那么如果我有很多嵌套的 lambda,模板参数的数量似乎会增长得很快(不一定是坏事,但它让我感到惊讶)。

最佳答案

我不确定您是否真的可以说 lambda 是模板化的。具有自动模板参数的 lambda 类型根本不是模板,因为它与模板模板参数不匹配:

#include <iostream>

auto foo = [](auto param){};

template <class T>
struct functor_template {
void operator()() const { }
};

template <template <class...> class Foo, class... Ts>
void bar(Foo<Ts...>) {
}

int main() {
//bar(foo); //prog.cc:7:6: note: template argument deduction/substitution failed
bar(functor_template<int>{});
}

原因很简单 - 在这种 lambda 中,唯一非常接近于称为模板的是它们的 operator()


但我想你想问更多的是,带有自动参数的 lambda 内部的 lambda 类型是否取决于传递给该 lambda 的参数类型。答案是——是的。这很容易测试:

#include <iostream>
#include <type_traits>

auto foo = [](auto p){
static_cast<void>(p);
typedef decltype(p) p_t;
auto bar = [](){
return static_cast<p_t>(10);
};
return bar;
};

int main() {
static_cast<void>(foo);
std::cout << std::is_same<decltype(foo(int{})), decltype(foo(float{}))>::value << std::endl;
std::cout << std::is_same<decltype(foo(int{})), decltype(foo(int{}))>::value << std::endl;
}

输出:

0
1

关于c++ - 模板化 lambda 中的所有 lambda 是否也是模板化 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43950399/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com