【发布时间】:2017-02-04 18:41:24
【问题描述】:
考虑以下代码,灵感来自 Barry 对this 问题的回答:
// Include
#include <tuple>
#include <utility>
#include <iostream>
#include <type_traits>
// Generic overload rank
template <std::size_t N>
struct overload_rank
: overload_rank<N - 1>
{
};
// Default overload rank
template <>
struct overload_rank<0>
{
};
// Prepend argument to function
template <std::size_t N, class F>
auto prepend_overload_rank(F&& f) {
using rank = overload_rank<N>;
return [f = std::forward<F>(f)](rank, auto&&... args) -> decltype(auto) {
return std::forward<F>(f)(std::forward<decltype(args)>(args)...); // here
};
}
// Main
int main(int argc, char* argv[])
{
auto f = [](int i){return i;};
prepend_overload_rank<5>(f)(overload_rank<5>(), 1);
return 0;
}
由于注释here 的行没有编译,我不明白为什么:
With g++:
error: no matching function for call to 'forward<main(int, char**)::<lambda(int)>&>(const main(int, char**)::<lambda(int)>&)'
With clang:
error: no matching function for call to 'forward'
替换
return std::forward<F>(f)(std::forward<decltype(args)>(args)...);
通过
return f(std::forward<decltype(args)>(args)...);
显然让它工作了,但是我还是不明白为什么,我的目标是实现功能的完美转发。
【问题讨论】:
-
提示:添加
mutable修复它(return [f = std::forward<F>(f)](rank, auto&&... args) mutable -> decltype(auto) {)。std::forward是红鲱鱼;这只是一个 const 正确性的问题。 -
decltype(auto)是错误的。你需要 SFINAE 才能参与进来。
标签: c++ templates lambda c++14 perfect-forwarding