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

c++ - 使代码“转发可参考”

我打开了这篇关于转发参考的帖子,这是一个(希望如此)MCVE 代码:

由于这不是全部代码,也许我必须根据答案添加额外的代码。

无论如何,正如在这个答案中所建议的那样,这个版本不可能转发参考,因为Args没有推导出来。

所以我的问题是:是否有可能使此代码“转发可引用”?

0 投票
1 回答
41 浏览

c++11 - 如何转发左值引用?

我有这个代码:

由于memFunc(args ...);发生的情况是副本args是排序的而不是排序vec的,所以最后vec将是 unsorted after callFunction(...)

我认为为了解决这个问题forward可以帮助我,但如果我尝试:return cachedFunc(forward<Args>(args) ...);然后会发生一些不好的事情(比如vector::size=0)。

我怎样才能转发args参考sort_vec

0 投票
1 回答
47 浏览

c++11 - 为什么转发参考不起作用?

我对这段代码有疑问:

当前的示例无法编译,如果我更改s为非常量,它会移动字符串。

我有类似的代码可以正常工作,但在这种情况下,我看不到有什么问题。

0 投票
1 回答
1169 浏览

c++ - 为什么 std::forward 返回 static_cast而不是 static_cast?

让我们有一个名为 Y 的函数重载:

现在,让我们定义一个类似于 std::forward 的模板函数

现在看看 main()

正如预期的那样,输出是

现在回到模板函数f()并替换static_cast<T&&>(x)static_cast<T>(x). 让我们看看输出:

一样的!为什么?如果它们相同,那么为什么要从tostd::forward<>返回一个演员表?xT&&

0 投票
1 回答
619 浏览

c++ - 使用 auto&& 和 const auto & 的经验法则

我研究过auto,我知道它从初始化值中推断出类型。如果我尝试编写一些使用指南auto,我可以将以下语句作为规则吗?

  1. 用于auto &&所有可修改的值(r 值和 l 值,因为它是通用参考),
  2. auto &&即使对于只读值,
  3. auto尽可能使用(个人偏好的编码风格)。

编辑

所以在上面的例子中,我使用auto &&了所有三个功能

  • getObj
  • getObjByRef
  • getObjConst

它按预期工作。现在我可以得出结论

  • auto &&可用于保存(初始化)任何值,
  • 我们可以使用auto &&每一个可能的地方。

您看到这种方法的任何缺陷吗?

0 投票
0 回答
70 浏览

c++ - 重载/特化全局运算符,最初使用模板右值引用声明

假设我们在库中定义了全局运算符(全部在全局命名空间中)

我想为我的一门课重载/专业化(是哪一个?),例如:

我想要一个运算符重载,它可以与 const/non-const 左值和右值一起使用,就像库中的那个一样。

事实证明,我必须至少制作三个:

  • "MyClass &" 捕获非常量左值
  • "const MyClass &" 捕获 const 左值
  • "MyClass &&" 捕获右值

必须为每个专业类编写三个重载似乎并不正确。我不应该能够使用“const MyClass &”(正如我们在“流”类重载<<中随处可见)或使用“MyClass &&”(应该能够捕获所有内容)捕获所有内容吗?

这是使用带有“const MyClass &”的单个运算符的尝试(不编译),对于任何类型的参数都应该没问题:

上面没有编译,因为在 oss << 对象上,编译器总是尝试使用库中的模板运算符,而不是我的。我正在使用 Visual Studio 2015(更新 3),我认为这对于 C++11 的这一部分是可以的。编译器错误是:

接下来是编译器尝试过的所有二元运算符 << 的很长列表,例如:

然后最后(我们看到问题是它试图实例化第 22 行而不是使用我的运算符):

库代码的设计是好是坏可能是一个问题,但这不是我现在要问的。正如我所说,复制我的运算符以获取(非常量) MyClass & 工作正常,但我很确定我不应该复制代码(SpecialStream 毕竟使用单个运算符完成所有操作)。

有没有办法在一个函数中做到这一点?

0 投票
1 回答
577 浏览

c++ - 为什么 std::thread 通过转发引用接受函子

为什么一个std::thread对象通过转发引用来接受函数参数,然后用 复制该对象decay_copy?按值接受函数对象不是更容易吗?

一般来说,为什么不将函数模板化以便按值获取函数对象?引用性不能用reference_wrappers 来模仿吗(这会更明确,并且还可以方便地有一个成员operator()来调用存储的函数)?

0 投票
1 回答
4776 浏览

c++ - 为什么添加`const`会使通用引用成为右值

我一直在阅读 Scott 关于 c++11 和 14 的最后一篇杰作中的通用引用,尽管有一个参数分配给左值或右值类型引用参数,但在两者之间有一些称为通用引用的东西可以推断为l/rvalue 基于传递的参数的类型特征。我可以理解是什么使参数成为通用引用,但我不清楚的一件事是为什么将 const 添加到类型参数const T&& p会使 p 成为右值:

当分配给参考参数时,const做的比这更多。

0 投票
1 回答
495 浏览

c++ - 在 C++17 中使用转发引用时,模板结构是否需要 std::decay?

在 C++17 中,可以在不指定模板类型的情况下实例化对象。基本上,这段代码将编译:

因此,假设以下代码:

我应该std::decay在这样的元组声明中使用吗?

因为这就是我如何编写一个函数来根据推导的模板类型返回一个对象:

我可以在 Foo 的构造函数中看到这种模式,它使用转发引用将值正确传递给元组。我不确定这里的类型推导是否表现相同。

0 投票
3 回答
240 浏览

c++ - 转发引用、引用限定符和模板成员函数

取以下成员函数:

在这种情况下,x是一个转发引用,因为&&它用于模板内的函数参数。这正如预期的那样。

现在使用这个函数:

我希望this会以类似的方式对待它;作为转发参考。因此,我希望以下程序能够正常编译和运行:

但是使用 GCC 4.8.4 和 6.0.1,它不会。相反,我得到以下信息:

似乎this没有进行转发参考。这是正确的还是错误的?是否应该this被视为转发参考?标准的哪一部分规定了这一点?