问题标签 [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 投票
3 回答
293 浏览

c++ - 如何创建一个多次使用一个值而不复制它的宏?

我想创建一个宏,将一对解包成两个局部变量。如果它只是一个变量,我不想创建该对的副本,这将完成:

但是,我也希望它不计算多次给出的表达式,例如这应该只调用expensive_computation()一次:

如果我做:

然后它适用于expensive_computation()案例,但它会在案例中制作副本x。如果我做:

然后它可以在x没有复制的情况下在案例中工作,但在expensive_computation()案例中失败。如果我做:

这些都可以编译和运行,但我怀疑它们会调用未定义的行为——我对此是否正确?另外,这些中的任何一个都有意义吗?


有没有办法创建一个适用于这两种用例的宏——x在给出表达式或函数调用的结果时,既不复制也不调用未定义的行为?

0 投票
2 回答
88 浏览

c++ - 移动和复制重载构造函数非法

我有一个正在编写的类,它将为其一个构造函数采用一种特殊类型,该类型可以是任何符合我要求的类型。我遇到了这个模板化构造函数导致我的复制和移动构造函数非法重载的问题!

我的班级是这样安排的:

我怎样才能绕过这个限制?

0 投票
3 回答
1280 浏览

c++ - const ref 类型的函数参数模板参数不明确

我在将 const ref 参数传递给调用其他函数的模板函数时遇到问题。考虑以下代码:

所以,我有一个A::foo带有const int&参数的成员函数,我想在 wrapper 中调用它a_caller。第 (1) 行导致以下错误:

我的第一个问题是为什么会这样?我给编译器一个非重载函数A::foo,为什么不能从中推导Args出来?第二个问题是为什么 std::make_unique 不会发生这种情况?以下代码对我来说看起来相同,但编译器推断构造函数参数类型没有问题:

0 投票
1 回答
319 浏览

c++ - 通用类型演绎斯科特迈耶斯

我正在阅读 Scott Meyers 的《Effective modern C++》

对于作为函数参数的通用引用,初始化程序在调用站点提供。

为了使引用具有普遍性,类型推导是必要的,但这还不够。引用声明的形式也必须正确,而且 from 是相当受限制的。它必须是精确的“ T&&”。

当 f 被调用时,类型T将被推断出来(除非调用者明确指定它,这是我们不会关心的边缘情况)。但是param的类型声明的形式不是“ T&&”,而是“ std::vector<T>&&”。这排除了 param 是通用参考的可能性。因此 param 是一个右值引用,如果您尝试将左值传递给f

在上面我有以下问题

  1. 作者所说的“除非调用者明确指定它,否则我们不会关心的边缘情况”是什么意思?请求提供示例什么是边缘案例作者提到调用者明确指定
0 投票
1 回答
1828 浏览

c++ - 通用参考的标准/官方名称是什么?

0 投票
2 回答
842 浏览

c++ - auto&& 变量不是右值引用

为什么 auto&& 不是右值引用?

以下是右值参考示例

为什么 var2 不是右值引用,但 f 和 var2 是右值引用?

0 投票
2 回答
151 浏览

c++ - 控制绑定到什么样的引用`T`

在考虑可以做些什么来解决std::min 悬空引用问题时,我想到的一个想法是为将被删除的右值添加一个重载(实际上每个组合为 3 个)。问题是这T&&将是一个转发引用,而不是一个右值引用。

我想将这个问题与std::min具体问题分开并使其更笼统。std::min可以作为一个例子,为什么你需要这样的东西。

让我们简化和概括问题:

问题是:如何控制泛型模板参数T可以绑定到哪些类型的引用?它如何扩展多个参数(例如std::min以防万一)?

0 投票
1 回答
212 浏览

c++ - 如何将类型约束和隐式转换与 C++11 通用引用结合起来?

在函数中,我需要区分左值和右值引用,因此明显的路径是重载:

这完全具有所需的行为,具有明确定义的类型和隐式转换。但是有太多的代码重复,我更愿意将相关决策封装在里面,只保留一个函数,因此通过通用引用传递可能是一种选择:

然而,这有一个不幸的缺点,现在任何对象都可以作为第一个参数传递,因此可以通过 enable_if 施加约束:

这似乎可以完成这项工作,但是(我猜已经通过模板化了)我们失去了一个很好的重载属性,它可以触发隐式转换构造函数到类型 A(比如从类型 C 参数)。重载不是一个选项,因为某些函数可能有 3 个或更多 A&& 参数,无意处理组合爆炸。可以以某种方式恢复隐式转换吗?当然,一种解决方法可能是例如为 A 添加其他允许的参数类型,并在主函数中执行任何需要的转换,但这是侵入性的、丑陋的、显式隐含并产生混淆(原始 C 参数可能是左值 [参考]并通过转换产生一个右值)。有更好的办法吗?

0 投票
2 回答
223 浏览

c++ - 转发参考和模板模板

考虑这两个模板函数:

为什么前者接受左值(通过使用转发引用)而后者不接受?


看起来身份别名模板可以作为转发参考吗?也可能与此有关,但它似乎涵盖了转发引用限制的不同方面。

0 投票
1 回答
481 浏览

c++ - c++:关于转发引用的混淆

我阅读了 Scott Meyers 的这篇(写得非常好)关于C++11 中的转发参考的文章。

现在,关注本文的这一部分:

因此,与其他情况相比,省略号不会&&产生右值引用,但它仍然是通用引用。

据我了解,当我们有通用引用时,我们可以调用传递右值和左值的函数(哇,太酷了!)

现在,我已经实现了这个功能:

所以(使用与前面示例相同的逻辑),&&表示转发引用。

但是,如果我尝试拨打此电话:

编译器会抱怨You cannot bind an lvalue to an rvalue reference

为什么会发生这种情况?

整个代码: