问题标签 [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.

0 投票
1 回答
545 浏览

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

如果(成员)函数模板没有其他重载(例如,f(T &)或) ,那么就是所谓的转发引用,并且是,或者对于某些cv 限定类型。但是对于成员函数的cv-ref-qualifiers没有这样的规则。在一个总是右值引用限定符中。f(volatile T &&)template< typename T > f(T &&);T &&TUU &Ustruct 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-qualifiercv-ref-qualified类型:等。*thisauto &&decltype(&&)

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

0 投票
1 回答
191 浏览

c++ - 引用限定符和删除的成员方法

考虑以下代码:

它不会编译说成员方法不能重载,当然这是有道理的。

另一方面,以下代码编译:

那是合法的代码吗?
难道不能在同一个类中定义两个完全不同的接口,前者用于左值,后者用于右值?
除了它没有多大意义之外,它真的伤害了我。
不应该将已删除的函数作为一个整体删除,而不是仅当您是左值时才删除
此功能的目的是什么?它是经典的不起眼的角落案例还是我看不到的东西?

0 投票
2 回答
30 浏览

c++ - 引用限定成员的模板实例化错误

代码运行,除非我尝试将其分解为单独编译(*.hh、*.cc、*.ie 和 main)。(注释掉的)语句将发出编译器 ICE。

我看不出实例化语法有什么问题。有人可以帮我解决这个...

0 投票
0 回答
61 浏览

c++ - 引用为 C++ 函数声明中的最后一个符号?

看着 Boost::Optional可选类模板头,我遇到了这个:

对于我的一生,我在其他任何地方都找不到这种语法(作为最后一个符号的引用)我认为它与类型(const l-val,l-val,r-val)的重载有关运算符所属的对象,但我在任何地方都没有看到这个描述。

有人能告诉我这个语法是什么意思吗?

0 投票
2 回答
217 浏览

c++ - 尾随返回类型、declval 和引用限定符:它们可以一起工作吗?

考虑以下示例:

B当使用(line )调用时(*),代码不再编译以在特定情况下std::declval转换T为右值引用类型。
如果我们按如下方式稍微改变它,我们就会遇到相反的问题:

现在,在特定情况下,(*)将无法std::declval将类型转换为左值引用类型。

有没有办法定义一个接受类型的表达式,T如果它有一个成员函数f,不管它的引用限定符是什么?


我没有任何真实的案例可以使用它,也无法制作任何真实的使用示例。
这个问题是出于好奇,仅此而已。
我知道如果ref-qualifier存在是有原因的,我不应该尝试破坏课程的设计。

0 投票
2 回答
712 浏览

c++ - 为什么在这种情况下不能推导出模板参数?

谁能解释为什么编译器(g++,visual c++)在这种情况下无法推断出模板参数?

为什么编译器不能将 T 推断为 MyClass?这只发生在被 ref 限定符重载的方法上。如果一个方法被 const-ness 或参数类型重载,一切正常。在这种情况下,似乎只有 Clang 可以推导出 T。

0 投票
0 回答
122 浏览

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 中,我也很乐意知道。

0 投票
1 回答
114 浏览

c++ - 如何删除类似的 ref 限定成员函数之间的代码重复?

类似于如何删除类似的 const 和非 const 成员函数之间的代码重复?,我想删除几乎相同的成员函数之间的代码重复,除了 ref 限定符。

假设我有一个类似这样的课程:

我们想要为构建器对象执行此操作并非不可想象,因为如果我们完成了MyStringBuilder.

除了使用成员的地方,const&版本和&&版本之间的代码是相同的。这两个函数之间的唯一区别是&&版本std::move是任何成员,只要它们被引用。

如何避免这种代码重复?

0 投票
3 回答
830 浏览

c++ - 从 r-value ref-qualified 方法移动还是不移动?

在以下 C++11+ 代码中,应该首选哪个 return 语句构造?

0 投票
1 回答
664 浏览

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]部分: