c++ - ref-qualifier `const &&` 有什么用?

标签 c++ c++11 language-lawyer move-semantics rvalue-reference

在前面的问题之后,我一直在研究 ref-qualifiers。

给定下面的代码示例;

#include <iostream>
#include <string>
#include <utility>

struct A {
  std::string abc = "abc";
  std::string& get() & {
    std::cout << "get() &" << std::endl;
    return abc;
  }
  std::string get() && {
    std::cout << "get() &&" << std::endl;
    return std::move(abc);
  }
  std::string const& get() const & {
    std::cout << "get() const &" << std::endl;
    return abc;
  }
  std::string get() const && {
    std::cout << "get() const &&" << std::endl;
    return abc;
  }
};

int main()
{
  A a1;
  a1.get();
  const A a2{};
  a2.get();
  A().get();
  const A a3{};
  std::move(a3).get();
}

输出如您所料:

get() &
get() const &
get() &&
get() const &&



这使用 clang 和 gcc 4.9.1 编译和运行(虽然不是 4.9.0)。直播sample here .

一般代码(示例用于查看代码如何编译和运行)。
  • const && 的目的是什么?方法上的 ref-qualifier 是?

  • 该方法无法修改对象上的内容(它是const),尝试return std::move(abc);来自 const &&方法实际上并没有 move std::string一点也不。大概您希望能够修改该对象,因为它是一个 r 值并且不会存在很长时间。如果 const &&合格的方法将被删除,代码std::move(a3).method()将绑定(bind)到 const &合格的方法,这将是有意义的。
  • 如果有的话,在限定为 const & 的方法之间的隐含语义差异是什么?和一个合格的const && ? IE。实现将如何变化,或者你为什么想要两者?
  • std::string真的能够被“搬”出临时对象吗?
  • std::string get() const && 的“规范”签名是什么样的?在这种情况下?
  • 最佳答案

    const&&的用处| ...(一般)
    const&& 的用处成员方法的限定符充其量是最小的。不能以与 && 相同的方式修改对象。方法将允许对其进行修改;它是 const毕竟(如前所述,mutable 确实改变了这一点)。因此,我们将无法撕掉它的内脏,因为临时文件无论如何都会过期,就像我们在类似于正常 move 的情况下所做的那样。 .
    const&& 在许多方面的用处最好在 const T&& 类型的对象有用程度的上下文中进行评估。是开始。 const T&& 有多大用处?函数参数 ?正如另一个答案中所指出的(对这个问题)here ,它们在声明函数被删除时非常有用,例如在这种情况下

    template <class T> void ref (const T&&) = delete;
    

    明确禁止纯右值和 xvalue 值类别类型的对象与函数一起使用,以及 const T&& bind to all prvalue and xvalue objects .

    What is the usefulness of const&& method qualifier?



    有趣的是,在提案 C++ library extensions , optional , § 5.3, 包括重载,例如
    constexpr T value() const &&;
    

    符合 const&& 的条件并指定执行与 && 相同的操作选择。

    我可以推断出这种情况的原因;是为了完整性和正确性。如果 value()方法在右值上调用,然后它执行相同的操作,与它无关 const或不。 const将需要通过被 move 的包含对象或使用它的客户端代码来处理。如果有一些mutable包含对象的状态,然后可以合法地更改该状态。

    这可能还有一些优点。没有特别的顺序...
  • 申报 = delete 禁止在纯右值和 xvalues 上使用该方法。
  • 如果类型有 可变状态 并且限定符在目标环境中有意义(可能除了其他限定符之外),请考虑它。
  • 如果您正在实现一个通用容器类型,那么对于 完整性和正确性 ,考虑添加它并执行与 && 相同的操作方法。这里的建议来自标准库(及其扩展)。

  • What would a "canonical" signature look like for a const&& qualified method?



    由于该方法将执行与 && 相同的操作。方法,我主张签名匹配 &&签名。

    关于c++ - ref-qualifier `const &&` 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62952449/

    相关文章:

    c++ - OpenCV imread 不起作用

    c++ - 如何调用父函数?

    c++ - 没有用于调用类型为 'hash<char">' 的对象的匹配函数(Stroustrup Book Drill)

    c++ - 我应该分配还是重置一个 unique_ptr?

    c++ - 有哪些有用的技巧可以追踪 C++ 中随机发生的 C0000005 访问冲突?

    c++ - 将一个矩阵复制到另一个矩阵的列中

    c++ - 分配器感知容器分配是如何实现的?

    c++ - 尾随返回类型中的类型标识歧义

    java - 位运算符在 Java 中究竟是如何工作的?

    c++ - 标准似乎支持(下面的代码片段编译)一个与类本身具有相同类型的静态数据成员