问题标签 [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.
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 值,则程序不会编译:
我希望编译器推断Buf
为int&
. 遵循引用折叠规则,我希望input_buffer
成为左值引用,即& + && -> &
,并且output_buffer
也成为左值引用;& + & -> &
.
所以问题是:为什么这段代码不能编译?
(注意:我不一定要求解决问题,而是要求解释。)
如果我需要详细说明,请随时询问。
编辑:如果调用:copy(i, j);
GNU GCC 编译器给出:错误:没有用于调用“复制(int&,int&)”的匹配函数注:候选:模板无效副本(Buf&&,buf&)注:模板参数推导/替换失败:注:推导参数“Buf”(“int&”和“int”)的冲突类型
如果打电话:
copy<int&>(i, j);
好的。
c++ - 为什么通用引用不适用于数组?
我的编译器是 clang 7.0 和-std=c++17
.
为什么通用引用不适用于数组?
c++ - 为什么通用参考不保持其论点的恒定性?
如上面的代码所示。我的问题是:
为什么通用参考不保持其论点的恒定性?
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 ?
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&吗?
c++ - C++ 中容器的 decltype、通用引用和转发
我正在阅读decltype
Scott Meyers 所著的有效现代 C++ 中的引用和右值引用。我有以下代码
现在在主要功能中我有以下
我的问题是authAndAccess
函数接受右值参数,所以容器是临时的,返回的是对象是临时参考元素。但是为什么输出显示为int
我typeid
所期望的 forwared int &
。我确实理解 typeid 的 name 函数不准确,但是为什么在我们返回临时元素引用时它没有崩溃。
c++ - 为什么 C++ 标准不区分右值引用和转发引用?
据我所知,C++ 标准不区分右值引用和转发引用。
我想知道这背后的原因。
如果我想编写一个只接受左值表达式的模板函数,请执行以下操作:
但是如果我想写一个只接受右值表达式的模板函数:
事实证明,这个函数也接受左值表达式。
那么问题来了:这种语言设计背后的逻辑是什么?
c++ - 为什么不转发参考常量?
转发引用应该将参数转发给另一个函数,对吗?那么为什么不是 const 呢?
非常量引用允许函数修改其参数(而不仅仅是转发它们)。
c++ - 转发引用是否仍然是右值引用?
我仍然对为支持移动和转发而发明的规则感到困惑。我仍然不确定的一件事是:
转发引用只是右值引用(应用了引用折叠规则)吗?
如果它是一个右值引用,那么为什么该函数:
不仅接受右值,还接受左值?