为什么 std::apply 可以调用 lambda 而不是等效的模板函数?
Why can std::apply call a lambda but not the equivalent template function?
以下代码片段(在OS X上使用gcc 6.3.0编译,-std=c ++ 17)演示了我的难题:
#include <experimental/tuple>
template <class... Ts>
auto p(Ts... args) {
return (... * args);
}
int main() {
auto q = [](auto... args) {
return (... * args);
};
p(1,2,3,4); // == 24
q(1,2,3,4); // == 24
auto tup = std::make_tuple(1,2,3,4);
std::experimental::apply(q, tup); // == 24
std::experimental::apply(p, tup); // error: no matching function for call to 'apply(<unresolved overloaded function type>, std::tuple<int, int, int, int>&)'
}
为什么 apply 可以成功推断对 lambda 的调用,但不能推断对模板函数的调用?这是预期的行为吗?如果是,为什么?
两者之间的区别在于p
是一个函数模板,而q
- 一个通用的lambda - 几乎是一个带有模板化调用运算符的闭包类。
尽管所述调用运算符的定义与p
定义非常相似,但闭包类根本不是模板,因此它不会停留在模板参数解析的方式std::experimental::apply
。
这可以通过将p
定义为函子类来检查:
struct p
{
auto operator()(auto... args)
{ return (... * args); }
};
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 如何通过 std::apply 调用具有定义的第一个参数的可变参数模板函数?
- 为什么 std::apply 使用泛型函数失败
- 为什么 std::apply 可以调用 lambda 而不是等效的模板函数?
- 使用std::apply应用可变函数