关键词 ref qualifier
#include <cstdio>
#include <utility>
class SomeData {};
class Test
{
private:
SomeData m_stData;
public:
Test() = default;
Test(const Test &refOther) : m_stData(refOther.m_stData)
{
printf("Copy.\n");
}
Test(Test &&rvOther) : m_stData(std::move(rvOther.m_stData))
{
printf("Move.\n");
}
Test operator()() &
{
return Test(*this);
}
Test operator()() &&
{
return Test(std::move(*this));
}
};
int main()
{
Test b;
b()()()();
}
/* 输出:
Copy.
Move.
Move.
Move.
/*
在传统 C++ 中,成员函数通过 this 指针访问。可以处理所有需要左值的情况。
我们是否可以省去拷贝,得到一个右值对象的右值成员?
在经典语法中,我们最好的声明方式如下:
T& value();
T const& value() const;
在有 move 之前,我们只能拷贝。
引入 move 语义后,我们可以这么写
T t = std::move(alloc().value());
勉勉强强可以转一下。得到一个右值。
有了 ref qualifier 之后,我们可以非常直观地操作右值了:
T& value() &;
T&& value() &&;
T t = alloc().value();
一些历史:
如果 value() 不是一个成员函数,我们可以这样
T&& value(T&& this_);
T t = value(alloc());
如果是成员函数,由于成员函数通过隐式 this 指针调用,无法支持引用的 this(C++ 有 OO 的时候还没有引用)。因此无法处理上述情况。
有了 ref qualifier 之后,我们终于可以使用引用 this 了,有了更强地操作能力。
由于 ref qualifier 操作的是 this,所以无法用在 static 函数中。
认识到 ref qualifier 修饰的是 this,而不是函数,可以把这个语法和 static
,constexpr
,noexcept
,[[noreturn]]
区分开。也可以理解为什么 static 不能使用 ref qualifier。
认识到 ref qualifier 修饰的是引用的 this,而不是传统的 this 指针,可以理解为什么 ref qualifier 和 const qualifier 不能相互 override。
const qualifier 修饰的是隐式 this 指针。
参考链接:
https://akrzemi1.wordpress.com/2014/06/02/ref-qualifiers/
http://blog.aaronballman.com/2014/07/member-function-ref-qualifiers/
20180725
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。