enable_是否是定义仅接受RVALUE的函数但任何类型的函数的最简洁的方法?

发布于 2025-02-12 19:19:45 字数 975 浏览 5 评论 0 原文

我指的是:

#include <utility>

template<typename T, typename = std::enable_if_t<std::is_rvalue_reference_v<T&&>>>
auto f(T&&) {}

int main(){
    int i{};
    f(std::move(i)); // ok
    f(int{1});       // ok
    f(i);            // compile time error, as expected
}

还有其他方法可以实现同样的方法吗?

有一刻,我认为这样的事情可以起作用,

template<typename T>
auto f(decltype(std::declval<T>())&&) {}

但是IDE告诉我无法推断模板参数' t ',我验证了在这里上下文, exltype -specifier 的表达确实是一个未偿还的上下文。


我也对a c ++ 17 解决方案,如果存在。

I'm referring to this:

#include <utility>

template<typename T, typename = std::enable_if_t<std::is_rvalue_reference_v<T&&>>>
auto f(T&&) {}

int main(){
    int i{};
    f(std::move(i)); // ok
    f(int{1});       // ok
    f(i);            // compile time error, as expected
}

Are there any other, shorter ways to accomplish the same?

For a moment I thought something like this could work

template<typename T>
auto f(decltype(std::declval<T>())&&) {}

but the IDE told me couldn't infer template argument 'T', and I verified here, in the section Non-deduced contexts, that the expression of a decltype-specifier is indeed a non-deduced context.


I'm interested also in a solution, if any exists.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

二手情话 2025-02-19 19:19:45

您是否尝试过明确删除L值超载?

template <typename T>
auto f(T &&) {}

template <typename T>
auto f(T &) = delete;

Did you try explicitly deleting the l-value overload?

template <typename T>
auto f(T &&) {}

template <typename T>
auto f(T &) = delete;
飘逸的'云 2025-02-19 19:19:45

正如@HolyBlackCat所评论的那样,您可以使用概念来简化功能签名

#include <type_traits>

template<typename T>
  requires (!std::is_lvalue_reference_v<T>)
auto f(T&&) {}

或通过检查接受LVALUE参考的lambda表达式的有效性来检测LVALUE或RVALUE

#include <utility>

template<typename T>
  requires (!requires (T&& x) { [](auto&){}(std::forward<T>(x)); })
auto f(T&&) {}

As @HolyBlackCat commented, you can use concepts to simplify the function signature

#include <type_traits>

template<typename T>
  requires (!std::is_lvalue_reference_v<T>)
auto f(T&&) {}

Or detect lvalue or rvalue by checking the validity of a lambda expression that accepts an lvalue reference

#include <utility>

template<typename T>
  requires (!requires (T&& x) { [](auto&){}(std::forward<T>(x)); })
auto f(T&&) {}
宫墨修音 2025-02-19 19:19:45

如果您不需要Sfinae,则可以使用 static_assert

template<typename T>
auto f(T&&) {
    static_assert(std::is_rvalue_reference_v<T&&>);
}

You can use static_assert if you don't need SFINAE:

template<typename T>
auto f(T&&) {
    static_assert(std::is_rvalue_reference_v<T&&>);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文