gpt4 book ai didi

c++ - 从 r 值引用限定方法返回 r 值引用是一个好习惯吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:34 26 4
gpt4 key购买 nike

如我所见,一般规则是 not to return r-value references from functions at all (极少数特殊情况除外)。但是类方法呢?

C++ 标准库中有一个从类的右值引用限定方法(std::optional<T>::operator*() 类的 std::optional<T>::value() std::optional<T> 方法)返回右值引用的示例。请参阅 C++17 标准的 23.6.3 Class template optional [optional.optional]23.6.3.5 Observers [optional.observe] 部分:

// 23.6.3.5, observers

constexpr T&& operator*() &&;
constexpr const T&& operator*() const&&;
constexpr T&& value() &&;
constexpr const T&& value() const&&;

最佳答案

一般考虑类成员访问。假设我们有这样的类型:

struct A {
int x;
};

现在让我们以A类型的对象为例。

A a;

现在表达式 (a) 是一个左值,成员访问 (a).x 也是一个左值。但是表达式 std::move(a) 是一个右值(实际上是一个 xvalue),而 std::move(a).x 现在也是一个右值(实际上,一个 xvalue)。这是核心语言中成员访问的行为。

现在,用户定义类型提供模仿核心语言行为的用户定义行为是有意义的。我们可以通过使用 ref 限定的成员函数来做到这一点,它可以区分实例是左值还是右值。当成员函数的目的是提供对子对象的访问时,当实例是右值时,将该子对象作为右值(特别是 xvalue)返回是合理的。

您大概指的一般建议是您不应该随机返回对某些您无法控制的任意对象的右值引用。在这种情况下,返回拷贝通常要好得多,这样您的函数就可以独立于不相关对象的生命周期的上下文假设来使用。但是当你谈论成员函数并且所讨论的对象是类实例时,你有更多的控制权,返回 xvalues 可能是有用的工具。

这里的元教训是,在 C++ 中询问“ 是否是好的做法”并不总是有用。 C++ 给了你很多工具,有时你不得不在上下文中谈论设计。

关于c++ - 从 r 值引用限定方法返回 r 值引用是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com