如果没有其他重载(比如,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中使用?
是的,有这样的建议。
背景:
由于我们已经在模板函数中有转发引用,您可以简单地将您的成员函数转换为模板朋友函数(并通过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