首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定义只绑定xvalue或prvalue,而不是同时绑定xvalue或prvalue的函数

如何定义只绑定xvalue或prvalue,而不是同时绑定xvalue或prvalue的函数
EN

Stack Overflow用户
提问于 2013-12-27 10:39:26
回答 1查看 221关注 0票数 6

是否有一种方法来定义只处理xvalue或prvalue的函数(或者这里是独占的或)?

例如,假设我有一个方法f(foo&& f),我如何声明f来绑定xvalue类型和拒绝prvalue类型,反之亦然?

代码语言:javascript
复制
struct Foo{};
void xvalue(/*what put here ?*/){}
void prvalue(/*what put here ?*/){}

void main()
{
  Foo foo;

  prvalue(Foo());//compile
  prvalue(std::move(foo)));//fail at compilation

  xvalue(std::move(foo)); //compile
  xvalue(Foo());//fail at compilation
}

也许通过使用std::enable_if和解密类型(E)是x值的rvalue引用类型和prvalue的非引用类型这一事实?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-27 16:18:20

使用来自这个answer的代码应该是微不足道的。

代码语言:javascript
复制
#include <type_traits>
#include <iostream>
#include <utility>

template <typename T>
bool is_xvalue()
{
    if (std::is_lvalue_reference<T>::value)
        return false;
    else if (std::is_rvalue_reference<T>::value)
        return true;
    return false;
}

template <typename T>
bool is_prvalue()
{
    if (std::is_lvalue_reference<T>::value)
        return false;
    else if (std::is_rvalue_reference<T>::value)
        return false;
    else
        return true;
    return false;
}

struct Foo {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << is_prvalue<decltype(Foo())>() << "\n"; // true
    std::cout << is_prvalue<decltype(std::move(Foo()))>() << "\n"; // false
    std::cout << is_xvalue<decltype(Foo())>() << "\n"; // false
    std::cout << is_xvalue<decltype(std::move(Foo()))>() << "\n"; // true
    return 0;
}

不幸的是,您必须显式实例化模板,否则由于某种原因它无法工作。

代码语言:javascript
复制
struct Foo {};

template <typename T, typename = typename std::enable_if<is_prvalue<T>(), void>::type>
void prvalue(T&& t)
{
}

template <typename T, typename = typename std::enable_if<is_xvalue<T>(), void>::type>
void xvalue(T&& t)
{
}

prvalue<decltype(Foo())>(Foo());
// prvalue<decltype(std::move(Foo()))>(std::move(Foo())); - compile error
xvalue<decltype(std::move(Foo()))>(std::move(Foo()));
// xvalue<decltype(Foo())>(Foo()); - compile error
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20799189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档