gpt4 book ai didi

c++ - 转发成员函数的 cv-ref-qualifier

转载 作者:可可西里 更新时间:2023-11-01 15:27:46 26 4
gpt4 key购买 nike

如果(成员)函数模板 f(T &) 没有其他重载(例如 f(volatile T &&)template< typename T > f(T &&); ) , 然后 T &&是所谓的转发引用TU , 或 U &对于某些 cv-qualified 类型 U .但是对于成员函数的 cv-ref-qualifiers 则没有这样的规则。在 struct S { void f() && { ; } };一个S::f()始终具有右值引用限定符。

在通用代码中,避免定义某些成员函数的 4(甚至 8,如果我们还考虑 volatile 限定符)重载将非常有用,以防所有成员函数都做同样的事情。

以这种方式出现的另一个问题是,不可能定义 *this 的有效 cv-ref-qualifier在某种意义上。以下代码不允许确定成员函数的ref-qualifier operator ()&&& .

#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;
}

但是如果有上面的语法就好了。 IE。 decltype((*this))表示 *thiscv-ref-qualified 类型.在我看来,将这种语法引入即将到来的 C++ 标准版本并不是什么重大改变。但是&&因为 转发 cv-ref-qualifier 是(而且它看起来像是委员会(即核心语言工作组)的遗漏)。

另一个序列可以表示*this 的成员函数cv-ref-qualifiercv-ref-qualified 类型。进入它的 body :auto && , decltype(&&)

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

最佳答案

是的,有这样的提议。

背景:

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

现在,也许您真的非常想将函数用作成员函数,因为您真的非常喜欢这种语法。

提案:

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

如果类似的东西被接受,你将能够使用自由函数,比如第一个参数的成员函数。这将涵盖您在第一条评论中链接的示例代码。不可否认,它不会涵盖 operator(),但我认为与编写 8 个重载相比,这是一个小麻烦 :-)

关于c++ - 转发成员函数的 cv-ref-qualifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com