c++ - 如何强制函数只接受左值引用参数

标签 c++ templates

这是我的情况:

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/

相关文章:

c++ - 访问 ctor 中的私有(private)类内存

c++ - 有条件地提供 using 声明

c++ - 模板和函数对象 - C++

c++ - 如何同时提供默认模板参数和模板函数实参默认值?

c++ - 在模板化构造函数中调用构造函数时的有趣行为

c++ - 这个程序调用带有参数包的函数指针有什么问题?

C++ 在 Linux 上使用 wstring_convert

c++ - 添加多个 QTreeWidgetItems

c++ - 尝试与 Base 中的 Derived 函数成为 friend - 为什么它不起作用?

c++ - 网络消息格式化大量的 char、int,在 C\C++ 中转换