enable_是否是定义仅接受RVALUE的函数但任何类型的函数的最简洁的方法?
我指的是:
#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 解决方案,如果存在。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您是否尝试过明确删除L值超载?
Did you try explicitly deleting the l-value overload?
正如@HolyBlackCat所评论的那样,您可以使用概念来简化功能签名
或通过检查接受LVALUE参考的lambda表达式的有效性来检测LVALUE或RVALUE
As @HolyBlackCat commented, you can use concepts to simplify the function signature
Or detect lvalue or rvalue by checking the validity of a lambda expression that accepts an lvalue reference
如果您不需要Sfinae,则可以使用
static_assert
:You can use
static_assert
if you don't need SFINAE: