问题标签 [forwarding-reference]

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 回答
194 浏览

c++ - 函数模板推导左值引用和通用引用

假设我有这个功能copy

其中input_buffer是一个通用参考并且output_buffer是一个左值参考。

Reference collapsing rules确保input_buffer确实是,无论推导的类型如何Buf,都是通用参考,并且output_buffer确实是左值参考。

但是,我想知道Buf这里是如何推断类型的。

我发现copy传递了一个 r-value as input_buffer,(和一个 l-value as output_buffer,显然)Buf是一个非引用类型。

但是,如果我要传递两个 l 值,则程序不会编译:

我希望编译器推断Bufint&. 遵循引用折叠规则,我希望input_buffer成为左值引用,即& + && -> &,并且output_buffer也成为左值引用;& + & -> &.

所以问题是:为什么这段代码不能编译?

(注意:我不一定要求解决问题,而是要求解释。)

如果我需要详细说明,请随时询问。

编辑:如果调用:copy(i, j); GNU GCC 编译器给出:错误:没有用于调用“复制(int&,int&)”的匹配函数注:候选:模板无效副本(Buf&&,buf&)注:模板参数推导/替换失败:注:推导参数“Buf”(“int&”和“int”)的冲突类型

如果打电话: copy<int&>(i, j); 好的。

0 投票
2 回答
243 浏览

c++ - 为什么通用引用不适用于数组?

我的编译器是 clang 7.0 和-std=c++17.

为什么通用引用不适用于数组?

0 投票
1 回答
117 浏览

c++ - 为什么通用参考不保持其论点的恒定性?

如上面的代码所示。我的问题是:

为什么通用参考不保持其论点的恒定性?

0 投票
1 回答
155 浏览

c++ - l-value ref 和 r-value ref 和 non-ref 类型的完美转发可变参数模板?

我的程序我有模板类,这些模板类主要是用于特殊用途的 std::function<..> 的包装器。最小的例子是:

这些模板的实例化通常是左值引用、右值引用或无引用类型的组合。问题在于,当某些参数是非引用类型(例如 int 或 std::vector)时,调用 Bar 会导致错误。解决方法是声明一个临时变量,然后将其移动到函数调用中。

我希望能够将 Bar 与任何模板参数一起使用,而不必每次都重新分配和 std::move() ,而且还可以完美地转发 ref 参数。有没有办法做到这一点?

编辑 在网上浏览了一下之后 - 问题std::function<void(Args&&...)> function_;不是一个采用通用 ref 而是采用 r-val ref 的函数。因此,尝试转发 no-ref 类型会引发错误。

那么问题是,是否有可能拥有并存储一个带有通用引用的 std::function ?

0 投票
1 回答
88 浏览

c++ - C++通用引用和LRef参数的类型推导

假设我们有一些代码

根据https://en.cppreference.com/w/cpp/language/template_argument_deduction

4)如果P是一个对cv不合格的模板参数的右值引用(所谓的转发引用),并且对应的函数调用参数是一个左值,则使用对A的类型左值引用代替A进行推导

我想知道的是:“引用折叠”规则是否应用于推导类型 T(而不是 P,参数类型)?

那么我们真的有'Foo(rx)'T = int& &,它折叠成T = int&吗?

0 投票
1 回答
334 浏览

c++ - C++ 中容器的 decltype、通用引用和转发

我正在阅读decltypeScott Meyers 所著的有效现代 C++ 中的引用和右值引用。我有以下代码

现在在主要功能中我有以下

我的问题是authAndAccess函数接受右值参数,所以容器是临时的,返回的是对象是临时参考元素。但是为什么输出显示为inttypeid所期望的 forwared int &。我确实理解 typeid 的 name 函数不准确,但是为什么在我们返回临时元素引用时它没有崩溃。

0 投票
2 回答
728 浏览

c++ - Lambda 通过引用捕获右值引用

下面的代码标准正确吗?(神螺栓

即 by-ref 捕获表示临时的转发引用,并在同一表达式中从函数返回结果 lambda 值。

当然,存储 lambda 供以后使用会使它包含一个悬空引用,但我指的是内部的确切用法main

我对这个 SO 答案和潜在的这种语言缺陷的怀疑。具体来说,有一条令人生畏的评论说“标准中的引用捕获生命周期规则引用捕获的变量,而不是数据及其范围” ——这似乎是说捕获的对临时的引用在我的代码中可能是无效的。

0 投票
1 回答
80 浏览

c++ - 为什么 C++ 标准不区分右值引用和转发引用?

据我所知,C++ 标准不区分右值引用和转发引用。

我想知道这背后的原因。

如果我想编写一个只接受左值表达式的模板函数,请执行以下操作:

但是如果我想写一个只接受右值表达式的模板函数:

事实证明,这个函数也接受左值表达式。

那么问题来了:这种语言设计背后的逻辑是什么?

0 投票
1 回答
1349 浏览

c++ - 为什么不转发参考常量?

转发引用应该将参数转发给另一个函数,对吗?那么为什么不是 const 呢?

非常量引用允许函数修改其参数(而不仅仅是转发它们)。

0 投票
2 回答
179 浏览

c++ - 转发引用是否仍然是右值引用?

我仍然对为支持移动和转发而发明的规则感到困惑。我仍然不确定的一件事是:

转发引用只是右值引用(应用了引用折叠规则)吗?

如果它是一个右值引用,那么为什么该函数:

不仅接受右值,还接受左值?