这是我的情况:
template<typename T, typename F>
inline
auto do_with(T&& rvalue, F&& f) {
auto obj = std::make_unique<T>(std::forward<T>(rvalue));
auto fut = f(*obj);
return fut.then_wrapped([obj = std::move(obj)] (auto&& fut) {
return std::move(fut);
});
}
我想确保模板参数 F&& f
只接受非 const
左值引用。我应该如何执行?
最佳答案
And I want to make sure template parameter F&& f only accept a non-const lvalue reference.
那么您不应该使用转发引用。转发的整个想法是接受任何值类别并将其保留以供将来调用。所以第一个解决方法是不要在这里使用错误的技术,而是通过左值引用来接受:
template<typename T, typename F>
inline
auto do_with(T&& rvalue, F& f) {
// As before
}
如果您尝试将右值传递给函数,那应该会让编译器很好地提示。虽然它不会阻止编译器允许 const 左值(F
将被推断为 const F1
)。如果你真的想防止这种情况,你可以添加另一个重载:
template<typename T, typename F>
inline
void do_with(T&& , F const& ) = delete;
F const&
的参数类型会更好地匹配 const 左值(顺便说一句,右值也是),所以这个会在重载决议中被选中,并立即导致错误,因为它的定义被删除了。非常量左值将被路由到您要定义的函数。
关于c++ - 如何强制函数只接受左值引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50852470/