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 && 引用限定符的目的是什么?

方法无法修改对象上的内容(它是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;

明确禁止prvalue和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以禁止该方法在prvalues和xvalues上使用。
  • 如果该类型具有可变状态并且限定符在目标环境中有意义(可能除了其他限定符之外),请考虑它。
  • 如果您正在实现通用容器类型,那么为了完整性和正确性,请考虑添加它并执行与 && 方法相同的操作。这里的建议来自标准库(及其扩展)。

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

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

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

相关文章:

c++ - 您可以将临时对象传递给通过引用获取变量的函数吗?

header 中缺少 C++ ODBC SQL_ATTR_PARAMS_STATUS_PTR

c++ - 如何检测整个周期的C++随机引擎已经被消耗

c++ - 合并两个 std::sets

c++ - 告诉 std::thread 在满足条件时终止/停止自身

C++11随机数生成器UIntType矛盾

C++ vector 的所有组合

c++ - pre-main 全局初始化程序是否保证运行单线程?

c - 将 ptrdiff_t 的正值分配给 size_t 是否安全

c++ - 是否保证在 std::string 之前初始化指向字符串文字的指针?