前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在 C++ 中,你甚至可以 b()()()(); ——介绍 ref qualifier

在 C++ 中,你甚至可以 b()()()(); ——介绍 ref qualifier

原创
作者头像
春帆
修改2018-07-25 16:24:01
1.2K0
修改2018-07-25 16:24:01
举报
文章被收录于专栏:nothingnothing

关键词 ref qualifier

示例代码:

代码语言:c++
复制
#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 指针访问。可以处理所有需要左值的情况。

我们是否可以省去拷贝,得到一个右值对象的右值成员?

在经典语法中,我们最好的声明方式如下:

代码语言:c++
复制
T&       value();
T const& value() const;

在有 move 之前,我们只能拷贝。

引入 move 语义后,我们可以这么写

代码语言:c++
复制
T t = std::move(alloc().value());

勉勉强强可以转一下。得到一个右值。


有了 ref qualifier 之后,我们可以非常直观地操作右值了:

代码语言:c++
复制
T&  value() &;
T&& value() &&;
T t = alloc().value();

一些历史:

如果 value() 不是一个成员函数,我们可以这样

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档