以下代码按预期工作:
void foo(auto const &){}
auto const rng{ranges::view::all(v)};
ranges::for_each(rng, [](auto const & r){
foo(r);
});
但是以下内容:
void foo(auto const &){}
auto const rng{ranges::view::all(v)};
ranges::for_each(rng, &foo);
给出编译错误:
template argument deduction/substitution failed:
couldn't deduce template parameter 'F'
我看了一下 source但老实说,我无法理解这个问题。
最佳答案
如果没有明确指定所需的重载/实例化,您不能获取重载 或模板 函数的地址。
在您的第一个代码段中传递一个 lambda 表达式 是解决此问题的好方法。
或者,如果您有权访问 foo
,您可以将它变成一个函数对象:
namespace detail
{
struct foo_t
{
template <typename T>
void operator()(const T&) const { /* ... */ }
};
}
constexpr detail::foo_t foo{};
这允许你写:
ranges::for_each(rng, foo);
关于c++ - 使用 lambda 和全局函数调用 ranges::for_each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141181/