问题标签 [ref-qualifier]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 转发成员函数的 cv-ref-qualifier
如果(成员)函数模板没有其他重载(例如,f(T &)
或) ,那么就是所谓的转发引用,并且是,或者对于某些cv 限定类型。但是对于成员函数的cv-ref-qualifiers没有这样的规则。在一个总是右值引用限定符中。f(volatile T &&)
template< typename T > f(T &&);
T &&
T
U
U &
U
struct S { void f() && { ; } };
S::f()
volatile
在泛型代码中,避免定义某些成员函数的 4 个(甚至 8 个,如果我们还考虑限定符)重载是非常有用的,以防它们都做同样的事情。
以这种方式出现的另一个问题是,在特定意义上定义有效的cv-ref-qualifier是不可能的。*this
以下代码不允许确定成员函数的引用限定符operator ()
是否&&
为&
.
但如果有上述语法,那就太好了。即decltype((*this))
表示精确的cv-ref-qualified类型*this
。在我看来,将这样的语法引入到即将到来的C++标准版本中并不是一个重大改变。但是&&
作为转发 cv-ref-qualifier是(而且它看起来像是委员会的遗漏(即核心语言工作组))。
另一个序列可以在其主体中表示成员函数cv-ref-qualifier和cv-ref-qualified类型:等。*this
auto &&
decltype(&&)
是否有关于此问题的提案,准备在C++17中使用?
c++ - 引用限定符和删除的成员方法
考虑以下代码:
它不会编译说成员方法不能重载,当然这是有道理的。
另一方面,以下代码编译:
那是合法的代码吗?
难道不能在同一个类中定义两个完全不同的接口,前者用于左值,后者用于右值?
除了它没有多大意义之外,它真的伤害了我。
不应该将已删除的函数作为一个整体删除,而不是仅当您是左值时才删除?
此功能的目的是什么?它是经典的不起眼的角落案例还是我看不到的东西?
c++ - 引用限定成员的模板实例化错误
代码运行,除非我尝试将其分解为单独编译(*.hh、*.cc、*.ie 和 main)。(注释掉的)语句将发出编译器 ICE。
我看不出实例化语法有什么问题。有人可以帮我解决这个...
c++ - 引用为 C++ 函数声明中的最后一个符号?
看着 Boost::Optional可选类模板头,我遇到了这个:
对于我的一生,我在其他任何地方都找不到这种语法(作为最后一个符号的引用)我认为它与类型(const l-val,l-val,r-val)的重载有关运算符所属的对象,但我在任何地方都没有看到这个描述。
有人能告诉我这个语法是什么意思吗?
c++ - 尾随返回类型、declval 和引用限定符:它们可以一起工作吗?
考虑以下示例:
B
当使用(line )调用时(*)
,代码不再编译以在特定情况下std::declval
转换T
为右值引用类型。
如果我们按如下方式稍微改变它,我们就会遇到相反的问题:
现在,在特定情况下,(*)
将无法std::declval
将类型转换为左值引用类型。
有没有办法定义一个接受类型的表达式,T
如果它有一个成员函数f
,不管它的引用限定符是什么?
我没有任何真实的案例可以使用它,也无法制作任何真实的使用示例。
这个问题是出于好奇,仅此而已。
我知道如果ref-qualifier存在是有原因的,我不应该尝试破坏课程的设计。
c++ - 为什么在这种情况下不能推导出模板参数?
谁能解释为什么编译器(g++,visual c++)在这种情况下无法推断出模板参数?
为什么编译器不能将 T 推断为 MyClass?这只发生在被 ref 限定符重载的方法上。如果一个方法被 const-ness 或参数类型重载,一切正常。在这种情况下,似乎只有 Clang 可以推导出 T。
c++ - 成员函数的完美转发和引用限定符
C++11 引入了 ref-qualify 成员函数以及完美转发的能力。但是我们可以将它们混合在一起吗?
考虑这个(工作)示例:
在内部main()
,第一个调用调用版本 1 or bar::do_stuff()
,第二个调用调用版本 2 or bar::do_stuff()
。中存在一些重复的代码foo::do_stuff()
。如果 ref-qualifiers 用于除了隐含之外的参数*this
,我们可以轻松地进行完美转发:
有没有一种等效的方法可以完美地转发*this
对象?
注意:如果正确的解决方案只存在于 C++14 或 C++17 中,我也很乐意知道。
c++ - 如何删除类似的 ref 限定成员函数之间的代码重复?
类似于如何删除类似的 const 和非 const 成员函数之间的代码重复?,我想删除几乎相同的成员函数之间的代码重复,除了 ref 限定符。
假设我有一个类似这样的课程:
我们想要为构建器对象执行此操作并非不可想象,因为如果我们完成了MyStringBuilder
.
除了使用成员的地方,const&
版本和&&
版本之间的代码是相同的。这两个函数之间的唯一区别是&&
版本std::move
是任何成员,只要它们被引用。
如何避免这种代码重复?
c++ - 从 r-value ref-qualified 方法移动还是不移动?
在以下 C++11+ 代码中,应该首选哪个 return 语句构造?
c++ - 从 r-value ref-qualified 方法返回 r-value 引用是一种好习惯吗?
正如我所看到的,一般规则是根本不从函数返回 r 值引用(罕见的特殊情况除外)。但是类方法呢?
std::optional<T>::operator*()
C++ 标准库中有一个从类的 r-value ref-qualified 方法(和类std::optional<T>::value()
的方法)返回 r-value 引用的示例std::optional<T>
。请参阅C++17 标准的23.6.3 类模板可选 [optional.optional]和23.6.3.5 Observers [optional.observe]部分: