在上一个问题之后,我一直在研究 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
),尝试从
方法实际上根本不 move return std::move(abc);
>const &&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/