xvalue的定义如下:
- xvalue (“eXpiring”值)也指对象,通常在其生命周期结束时(例如,可以移动其资源)。xvalue是涉及rvalue引用(8.3.2)的某些表达式的结果。示例:调用返回类型为rvalue引用的函数的结果是xvalue。-end实例
我们是否会陷入实际需要使用返回类型为rvalue引用(即xvalue )的函数的境地?
const int && Foo()
{
// ...
}Move语义将rvalue引用作为参数,而不是返回值。所以我不认为是这样的。
发布于 2016-01-19 08:43:16
返回rvalue引用可用于已以rvalue作为参数的函数。一个简单的例子:
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构造函数来创建返回的对象,而第一个函数将传递它已经获得的引用。如果我们不返回原始引用,而是返回引用对象的一部分,则这更有用。
template<class T>
T&& getHead(std::vector<T>&& input) {
return std::move(input.front());
}发布于 2016-01-19 07:21:36
这正是std:移动的本质-- std::move执行的结果是xvalue。除此之外,很难判断,因为在大多数情况下,从函数返回引用是一件坏事。但也许有人会想出另一种巧妙的方法来使用这样的函数。
发布于 2016-01-19 08:31:05
我们是否会陷入实际需要使用返回类型为rvalue引用(即xvalue )的函数的境地?
例如,在容器类中使用的tuple有一个get重载,如下所示:
template< std::size_t I, class... Types >
typename std::tuple_element<I, tuple<Types...> >::type&&
get( tuple<Types...>&& t );我假设std::optional和std::variant在C++17中都会有类似的重载。
当然,唯一的要点是避免在一些非常特殊的情况下键入std::move,例如:
auto x = std::get<1>( f() );其中,f按值返回元组。
https://stackoverflow.com/questions/34870498
复制相似问题