问题标签 [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 回答
45 浏览

c++ - 为什么通用参考概念在函数指针的情况下不适用于地图插入

如果我不明确使用 std::pair 和 map insert ,有人可以解释为什么下面的代码不起作用:

我的理解是在 c++14 中我们不需要使用 std::pair 因为插入函数定义被更改为接受通用引用,如下所示:

0 投票
1 回答
32 浏览

c++11 - 转发转发引用的单个成员

我有一个函数可能会移动一个通用参数,但通过它们的成员。这些选项中哪个更正确:

  1. 这看起来更自然,但很奇怪,因为参数可能会移动两次 [a],这很奇怪,因为对象可能会变得无效。

    /li>
  2. 这不可能是不正确的,但它可能不会移动任何东西。

    /li>
  3. 这似乎是正确的,但代码太多。

    /li>

[a] 正如@Angew 指出的那样,该语句是不正确的,它看起来好像被移动了两次。std::forward(like std::move) 实际上并没有移动任何东西。最多移动成员(通过后续操作decltype(myhead)::operator=,但这正是目标。)

0 投票
2 回答
297 浏览

c++ - c ++中的模板通用引用无法编译

我无法理解为什么我的代码不能在这里编译。我从标准库中收到很多错误消息,大致如下

这对我来说没有意义,因为我认为 T&& 在没有推导 T 时是一个通用引用,它应该能够绑定到右值或左值。发布的这个示例是我试图从 Scott Meyer 的“Effective Modern C++”中复制一段我正在阅读关于通用引用的部分。书中示例的照片

我只是想知道为什么这不会编译或者我在这里缺少什么,因为据我所知,它实际上与示例相同。

0 投票
0 回答
84 浏览

c++ - 无法将左值绑定到转发引用

我有一个模板类,它使用可变参数模板参数和递归继承来保存 n 个 T。这很像一个元组,所以我在这里命名它:

我现在正在尝试创建一个 CompositeTuple 类,它允许将多个 MyTuple 对象串在一起。这旨在保存 MyTuple 对象的实例或对 MyTuple 对象的引用,其用法类似于:

不幸的是,我当前的 CompositeTuple 实现达不到标准:

CreateCompositeTuple 的调用会生成以下编译器错误:error: cannot bind 'MyTuple' lvalue to 'MyTuple&&'

我在这里做错了什么?尽管我无法解决问题,但显然,我所做的所有阅读都表明这应该是可能的。

编辑: 我需要在 CompositeTuple 中有更多方法可以访问 T 和 tupleSize 模板参数。像这样的东西:

编辑 2: 尝试按照 Igor 的建议添加模板化构造函数:

我现在在 CreateCompositeTuple 函数中出现“不完整类型的无效使用”错误。

0 投票
2 回答
432 浏览

c++ - 为什么调用具有通用或 r 值引用的重载重写函数是不明确的?

我有一个与引用转发有关的问题,对此我只是稍微熟悉。在陈述我的问题之前,我想说我已经阅读了一些与此语言功能相关的页面,它们让我感到困惑,而不是阐明我的问题。参考的参考文献是:[ 1 - 5 ],其中一些我觉得矛盾或不完全理解。意识到这个问题可能被认为是重复的事实,我还是发布了它,因为我找不到一个可以结合这三个因素的案例:

  • 具有 r 值引用的重载函数。
  • 模板类(不是函数)。
  • 在覆盖中调用父类的函数的重载函数的覆盖。

问题场景

我有两个类用于表示模型的变量。通用的是MState<T>,我将它模板化,因为我希望它包含任何可能的类型。它更像是我为与此问题无关的目的而创建的类型的包装器。然后,我有MOutput<T>,它本质上扩展MState<T>并表示用户定义模型的外部可见变量。

它们都有一个名为的成员函数setValue,它允许,嗯……设置它们的值。我知道实现运算符语义会很好,但现在我正在处理这个:

我认为我需要 (A) 允许 l 值成为调用中的有效参数MState::setValue。实际上,如果我删除它,编译器会抱怨它无法将左值引用转换为右值引用(我理解为 [ 4 ]。)但是,我想避免不必要的资源分配和复制,尤其是在处理临时文件时(例如ms.setValue(MyClass())。)因此(B)。

同样, (C) 是必要的,因为MOutput除了那些工具之外,我还需要 's 做更多的事情MState。对于上述相同的动机,我也想要(D)。

std::forward<T>(value)(C) 和 (D) 中的使用是由 [ 3 ] 推动的。

问题

当我尝试编译我的代码时,GCC 抱怨重载的函数签名在两个类和许多情况下都是模棱两可的。我想我不明白为什么,或者如何解决这个问题。T&&这里是通用参考吗?如果是这样,这些不应该接受任何类型的参数类型吗?

用例

GCC 无法编译MState<T>::setValue(std::forward<T>(value));(C) 和 (D) 的行。如果我将它们注释掉,在这些情况下我会得到同样的歧义错误:

参考文献

  1. https://www.codesynthesis.com/~boris/blog/2012/06/26/efficient-argument-passing-cxx11-part2/
  2. https://stackoverflow.com/a/31551595/1876268
  3. https://stackoverflow.com/a/3582313/1876268
  4. https://stackoverflow.com/a/40350289/1876268
  5. https://stackoverflow.com/a/5465371/1876268
0 投票
1 回答
194 浏览

c++ - C++:通用(转发)参考中不允许使用 const

我正在阅读这个 stackoverflow 答案const T&&,其中给出了不是通用(转发)参考的一个原因:

允许 const T&& 充当转发引用,将无法重载仅将右值引用作为参数的模板函数。

我不知道这是什么意思。我猜这意味着同一函数(模板)有两个重载,其中一个作为参数const T&&。我还假设将始终调用其中一个重载,而永远不会调用另一个。

如果我的假设是正确的,那两个重载函数是什么?或者如果我错了,引用的段落实际上是什么意思?

谢谢你。

0 投票
0 回答
112 浏览

c++ - 返回右值引用的原因

我看到一个定义如下的类:

我想不出任何返回函数类型的充分理由addElement()。返回右值引用是否有意义,或者这不是一个好主意?如果是这样,这样做的潜在原因是什么?

0 投票
1 回答
263 浏览

c++ - 如何返回转发参考?

返回前向(通用)引用的最自然方式是什么?

我想到的情况是构造并立即使用的类似流的对象。例如:

0 投票
1 回答
300 浏览

c++ - std::enable_if 和通用引用的使用差异

我试图std::enable_if更好地理解通用引用,但我对我的代码中发生的事情有点困惑。

首先,我注意到人们似乎以std::enable_if两种不同的方式使用:

  1. template<typename T, std::enable_if<condition, T>::type* = nullptr>或类似的东西。

  2. template<typename T> std::enable_if_t<condition, T> myfunc() {...}或类似的东西。

我理解第二个发生了什么,但我对为什么有人会使用第一个感到困惑。除了向模板添加另一个参数之外,这实现了什么?这是 SFINAE 的事情吗?

使用enable_if. 这是我的代码和我得到的结果。请注意,我使用的是 Howard Hinnant 的类型打印代码,来自“ Is it possible to print a variable's type in standard C++? ”,为简洁起见,我将在此省略。

无论如何,该功能conditionless似乎适用于一切。

我很困惑is_integraland decay,你可以在开头看到main。我得到输出:

true: unsigned long false: unsigned long false: unsigned long false: unsigned long

我不知道为什么最后三个是假的。

然后我遇到了问题(在下面的源代码中标记为 1 和 2),当以enable_if上述两种方式中的任何一种使用时,它们在接受整数或浮点类型的左值时拒绝编译。

为简洁起见,省略了标题和类型打印代码:

任何人都可以给我关于两种不同用途enable_if以及为什么我的代码enable_if拒绝接受左值的任何见解,将不胜感激。

0 投票
1 回答
257 浏览

c++ - 我如何知道作为 r 值传递的对象是否会被移动?

我将 lambda 传递给一个接受它作为 r 值引用的函数。

如果我的 lambda 是在函数调用本身中定义的,我真的不在乎它以后会发生什么。
但是,如果我的 lambda 是一个变量(比如我想多次使用它),我确实想知道它没有被移出。

有没有办法知道它是否会被移出,使其在呼叫返回后相应地无法使用或可用?

编辑:

澄清一下,lambda 没有捕获任何东西。我关心的是函子本身:auto fn = [](int a){ return a; };

让我更难。我将函子作为右值传递:std::move(fn)

std::move 只是一个演员表。它不会移动任何东西,但被调用者中的右值参数现在绑定到正确的右值。

问题是,fn保证会被感动吗?能保证不动吗?有任何保证吗?我可以让它以这种方式或那种方式运行,还是由被调用者决定?

我想知道,因为我想知道我可以fn作为函数参数传递两次。

编辑#2:

让我们再看一个案例。我必须用容器调用一个函数。矢量、地图或其他任何东西。函数签名说&&。我可以用 std move 或 std forward 包装我的容器,以将右值 ref 放入被调用者。这真的是一回事,因为他们都是美化的演员。

现在,假设我使用了标准转发,因为我真的很喜欢我的容器不会去任何地方。

我可以很容易地看到被调用者没有意识到我的意图,并在调用后移动我的容器使其无效(内脏)。这是语言缺陷还是我错过了什么?