在前面的问题之后,我一直在研究 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/