当前位置: 首页 > 知识库问答 >
问题:

为成员函数转发cv-ref限定符

董飞航
2023-03-14

如果没有其他重载(比如,f(T

在泛型代码中,避免定义某个成员函数的4(甚至8,如果我们还考虑volatile限定符)重载是非常有用的,如果所有成员函数都执行相同的操作。

以这种方式出现的另一个问题是,在特定意义上,不可能定义*this的有效cv ref限定符。下面的代码不允许确定成员函数运算符()的ref限定符是否为

#include <type_traits>
#include <utility>
#include <iostream>

#include <cstdlib>

#define P \
{                                                                       \
    using this_ref = decltype((*this));                                 \
    using this_type = std::remove_reference_t< this_ref >;              \
    std::cout << qual() << ' '                                          \
              << (std::is_volatile< this_type >{} ? "volatile " : "")   \
              << (std::is_const< this_type >{} ? "const " : "")         \
              << (std::is_lvalue_reference< this_ref >{} ? "&" : "&&")  \
              << std::endl;                                             \
}

struct F
{
    constexpr int qual() & { return 0; }
    constexpr int qual() const & { return 1; }
    constexpr int qual() && { return 2; }
    constexpr int qual() const && { return 3; }
    constexpr int qual() volatile & { return 4; }
    constexpr int qual() volatile const & { return 5; }
    constexpr int qual() volatile && { return 6; }
    constexpr int qual() volatile const && { return 7; }
    void operator () () & P
    void operator () () const & P
    void operator () () && P
    void operator () () const && P
    void operator () () volatile & P
    void operator () () volatile const & P
    void operator () () volatile && P
    void operator () () volatile const && P
};

int
main()
{
    {
        F v;
        F const c{};
        v();
        c();
        std::move(v)();
        std::move(c)();
    }
    {
        volatile F v;
        volatile F const c{};
        v();
        c();
        std::move(v)();
        std::move(c)();
    }
    return EXIT_SUCCESS;
}

但如果有上述语法,那就太好了。例如,decltype((*this))表示*this的确切cv ref限定类型。在我看来,在即将发布的C标准版本中引入这种语法并不是一个突破性的改变。但是

另一个序列可以表示成员函数cv ref限定符和cv ref限定类型的*this进入其主体:auto

是否有一个关于这个问题的提案,准备在C 17中使用?


共有1个答案

龙令雪
2023-03-14

是的,有这样的建议。

背景:

由于我们已经在模板函数中有转发引用,您可以简单地将您的成员函数转换为模板朋友函数(并通过enable_if保护它不被F以外的任何其他类使用,如果需要)。

现在,也许你真的,真的想把你的函数用作一个成员函数,因为你真的,真的更喜欢这种语法。

建议:

查找统一的调用语法建议,例如:n4174

如果这样的东西被接受,你就可以使用自由函数,比如第一个参数的成员函数。这将涵盖您在第一条评论中链接的示例代码。诚然,它不包括操作符(),但我认为与编写8个重载相比,这是一个小麻烦:-)

 类似资料:
  • 这是我上一篇文章的后续文章 参考非静态成员函数 在下面 const-、vole-和ref限定的成员函数 非静态成员函数可以在没有ref限定符的情况下声明,...在重载解析期间,X类的非静态cv限定成员函数被处理如下: 无ref限定符:隐式对象参数具有对cv限定X的类型左值引用,并且还允许绑定右值隐式对象参数 为了进一步探索这一点,我试用了上面链接中提供的源代码,如下所示: 我已经在每个基于引用限定

  • 根据文件,上面说 在重载解析期间,类X的非静态cv限定成员函数被视为一个函数,如果它没有ref限定符或具有左值ref限定符,则该函数将左值引用类型的隐式参数带到cv限定X。否则(如果它有rvalue ref限定符),它将被视为一个函数,将rvalue reference类型的隐式参数作为cv限定的X。 问题: 没有任何ref限定符的成员函数如何?它们将被视为使用左值限定符隐式声明的函数。我说得对吗

  • 考虑示例,示例的结果超出了我对一些相关规则的理解。 对于,它格式错误,因为它违反了以下规则,即: dcl.init.ref#5.2 否则,如果引用是对非const限定或易失性限定类型的左值引用,则程序格式错误。 这意味着,对常量T的左值引用不能绑定到任何右值,即使它们是引用兼容的<代码>AB=std::移动(A)显然违反了这条规则,因此它的格式不正确。 但是我不知道为什么要编译

  • 以下代码不编译,没想到: 我的理解是,临时不能绑定到

  • 本文向大家介绍浅析成员函数和常成员函数的调用,包括了浅析成员函数和常成员函数的调用的使用技巧和注意事项,需要的朋友参考一下 在Coordinate类中,有一个Display()成员函数和一个Display() const常成员函数,代码如下 Display()成员函数和一个Display() const常成员函数是互为重载的,那么如果我们直接像下面这样调用该方法,会调用的是哪个呢? 那么运行下程序

  • 员函数调整客户的银行借贷(例如 BanLAccount 类的 private 数据成员)。 类通常提供 public 成员函数,让类的客户设置(写入)或读取(取得) private 数据成员的值。这些函数通常称为get和set。更具体地说,设置数据成员interestRate的成员函数通常称为setInterestRate,读取数据成员IntersetRate的值通常称为 getInterestR