首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们什么时候实际需要“显式xvalue”?

我们什么时候实际需要“显式xvalue”?
EN

Stack Overflow用户
提问于 2016-01-19 07:07:09
回答 3查看 888关注 0票数 13

xvalue的定义如下:

- xvalue (“eXpiring”值)也指对象,通常在其生命周期结束时(例如,可以移动其资源)。xvalue是涉及rvalue引用(8.3.2)的某些表达式的结果。示例:调用返回类型为rvalue引用的函数的结果是xvalue。-end实例

我们是否会陷入实际需要使用返回类型为rvalue引用(即xvalue )的函数的境地?

代码语言:javascript
复制
const int && Foo()
{
    // ...
}

Move语义将rvalue引用作为参数,而不是返回值。所以我不认为是这样的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-19 08:43:16

返回rvalue引用可用于已以rvalue作为参数的函数。一个简单的例子:

代码语言:javascript
复制
struct X {
    X() = default;
    X(X&& other) { std::cout << "move ctor\n"; }
    X(X const&) = delete;
    void log(std::string const& s){ std::cout << "log: " << s << "\n"; }
};

void sink(X&& x) { 
    x.log("sink"); 
}

X&& passOn(X&& in) {
    in.log("pass");
    return std::move(in);
}

X moveOn(X&& in) {
    in.log("move");
    return std::move(in);
}

int main() {
    sink(passOn(X()));
    std::cout << "===============================\n";
    sink(moveOn(X()));
}

现场演示→

第二个函数将调用move构造函数来创建返回的对象,而第一个函数将传递它已经获得的引用。如果我们不返回原始引用,而是返回引用对象的一部分,则这更有用。

代码语言:javascript
复制
template<class T>
T&& getHead(std::vector<T>&& input) {
    return std::move(input.front());
}
票数 5
EN

Stack Overflow用户

发布于 2016-01-19 07:21:36

这正是std:移动的本质-- std::move执行的结果是xvalue。除此之外,很难判断,因为在大多数情况下,从函数返回引用是一件坏事。但也许有人会想出另一种巧妙的方法来使用这样的函数。

票数 5
EN

Stack Overflow用户

发布于 2016-01-19 08:31:05

我们是否会陷入实际需要使用返回类型为rvalue引用(即xvalue )的函数的境地?

例如,在容器类中使用的tuple有一个get重载,如下所示:

代码语言:javascript
复制
template< std::size_t I, class... Types >
typename std::tuple_element<I, tuple<Types...> >::type&&
    get( tuple<Types...>&& t );

我假设std::optionalstd::variant在C++17中都会有类似的重载。

当然,唯一的要点是避免在一些非常特殊的情况下键入std::move,例如:

代码语言:javascript
复制
 auto x = std::get<1>( f() );

其中,f按值返回元组。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34870498

复制
相关文章

相似问题

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