问题标签 [perfect-forwarding]
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++ - 正确使用通用参考
在c++11之前,我曾经写过这样的代码:
但是现在,有了移动语义,允许我的函数将右值引用作为参数并添加这些重载可能会变得有趣(至少在某些情况下):
从我收集到的信息来看,如果我希望能够在我的大函数中调用这些重载,我需要使用完美转发,它可能看起来像这样(它的可读性有点低,但我想它可以用模板类型的良好命名约定):
我的问题是这样的:这是否意味着如果我的小函数有其他重载,就可以使用不打算使用的类型参数调用大函数?
我认为这可能有助于防止这种情况:
虽然我不确定它是否不太严格,因为如果我尝试使用可隐式转换为 A、B 或 C 的类型调用大函数,我不知道它的行为...
但是......即使假设这有效,我真的没有其他选择吗?(我的意思是......这对眼睛来说并不容易)
c++ - 将铸造/构造变成完美的可转发功能
SSCCE:
给出错误:
value()
从错误消息来看,返回 a显然是一个问题const&
。
这里的关键点是,类型不是在第 17 行推导出来的,值被传递给它。construct
当函数被传递到apply
第 31 行时,类型被分配。
我为模板指定了错误的类型construct
。 construct<int, float>
. 如果我使用construct<int, float const&>
它的功能就好了。
但是,这很麻烦,并且需要了解apply
. 而且它也永远不会绑定左值,因为T
和T&&
是不同的类型。(因为缺少类型推导。)
有没有办法让我可以将一个函数传递给另一个函数并在调用它的站点上进行类型推导,这样我就可以或多或少地对调用者透明地进行完美转发?或者是否有另一种方法可以实现这一目标,不会将复杂性泄露给调用者?
c++ - 这是通用参考吗?std::forward 在这里有意义吗?
考虑一下这段代码,它使用了一个常见的习惯用法,即让函数模板构造一个专门针对推导类型的类模板的实例,如std::make_unique
and所示std::make_tuple
,例如:
在 Scott Meyers 的“通用引用”的上下文中,参数 to
make_foo
是通用引用,因为它的类型是推导的U&&
位置。U
构造函数的参数foo
不是通用引用,因为尽管它的类型是T&&
,但T
(通常)不是推导的。
但是在构造函数的情况下,在foo
我make_foo
看来,将构造函数的参数foo
视为通用引用可能是有意义的,因为T
已经由函数模板推导出来make_foo
。将应用相同的引用折叠规则,以便v
两个函数中的类型相同。在这种情况下,两者T
和U
都可以说已经推导出来了。
所以我的问题是双重的:
- 在调用者在通用引用上下文中推断出来
foo
的有限情况下,将构造函数的参数视为通用引用是否有意义,例如我的示例?T
- 在我的例子中,这两种用法都
std::forward
合理吗?
c++ - 如何在通用 lambda 中完美转发`auto&&`?
C++14 支持通用 lambda。但是,clang 3.4 拒绝了以下代码。
如何auto&&
在通用 lambda 中完美转发?
c++ - 如何使用 std::tuple 的值作为参数调用函数?
我想要的是f(magic_xxx(t))
等同于f(1, 2)
,如何实现?
c++ - 可以使用绑定来转发可变数量的参数吗?
在 C++14 中,我可以编写一个对任意数量的参数进行完美转发的 lambda:
有没有办法使用 达到相同的效果bind
?我知道通过bind
使用任意数量的参数创建的函数对象,并且我知道这些对象对未绑定的参数使用完美转发,但是有没有办法告诉bind
创建一个对传递给它的每个参数使用完美转发的函数对象,即使在对 ? 的调用中没有占位符bind
?
c++ - 为什么要使用完美转发的值(仿函数)?
C++11(和 C++14)引入了针对泛型编程的其他语言结构和改进。其中包括以下功能:
- R 值参考
- 参考折叠
- 完美转发
- 移动语义、可变参数模板等
我正在浏览C++14 规范的早期草案(现在有更新的文本)和第 20.5.1 节中的示例中的代码,编译时整数序列,我发现它们很有趣且很奇特。
问题
- 为什么功能
f
在apply_impl
被转发,即为什么std::forward<F>(f)(std::get...
? - 为什么不直接应用函数 as
f(std::get...
?
c++ - 为什么我们需要第二个 std::forward 特化?
据我从这个解释如何std::forward
工作http://thbecker.net/articles/rvalue_references/section_08.html可以理解,我们只能省去一个版本std::forward
:
但实际上,我们有(http://en.cppreference.com/w/cpp/utility/forward)第二个版本:
与前一个的不同之处仅t
在于定义方式(使用&&
)
那么,我们为什么需要它呢?如果删除它会破坏什么?
c++ - 为什么在 C++11/14 中没有 std::move_if_noexcept 对应的 std::forward?
我看过 Scott Meyers 在 GoingNative2013 “An Effective C++11/14 Sampler”上的演讲,他解释了std::move_if_noexcept
.
所以在我看来,应该有一个std::forward_if_noexcept
也保证异常安全的forward
?为什么标准库中没有这样的东西?还有另一种可能来保证吗?