问题标签 [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++ - 为什么通用参考概念在函数指针的情况下不适用于地图插入
如果我不明确使用 std::pair 和 map insert ,有人可以解释为什么下面的代码不起作用:
我的理解是在 c++14 中我们不需要使用 std::pair 因为插入函数定义被更改为接受通用引用,如下所示:
c++11 - 转发转发引用的单个成员
我有一个函数可能会移动一个通用参数,但通过它们的成员。这些选项中哪个更正确:
这看起来更自然,但很奇怪,因为参数可能会移动两次 [a],这很奇怪,因为对象可能会变得无效。
/li>这不可能是不正确的,但它可能不会移动任何东西。
/li>这似乎是正确的,但代码太多。
/li>
[a] 正如@Angew 指出的那样,该语句是不正确的,它看起来好像被移动了两次。std::forward
(like std::move
) 实际上并没有移动任何东西。最多移动成员(通过后续操作decltype(myhead)::operator=
,但这正是目标。)
c++ - c ++中的模板通用引用无法编译
我无法理解为什么我的代码不能在这里编译。我从标准库中收到很多错误消息,大致如下
这对我来说没有意义,因为我认为 T&& 在没有推导 T 时是一个通用引用,它应该能够绑定到右值或左值。发布的这个示例是我试图从 Scott Meyer 的“Effective Modern C++”中复制一段我正在阅读关于通用引用的部分。书中示例的照片
我只是想知道为什么这不会编译或者我在这里缺少什么,因为据我所知,它实际上与示例相同。
c++ - 无法将左值绑定到转发引用
我有一个模板类,它使用可变参数模板参数和递归继承来保存 n 个 T。这很像一个元组,所以我在这里命名它:
我现在正在尝试创建一个 CompositeTuple 类,它允许将多个 MyTuple 对象串在一起。这旨在保存 MyTuple 对象的实例或对 MyTuple 对象的引用,其用法类似于:
不幸的是,我当前的 CompositeTuple 实现达不到标准:
CreateCompositeTuple 的调用会生成以下编译器错误:error: cannot bind 'MyTuple' lvalue to 'MyTuple&&'
我在这里做错了什么?尽管我无法解决问题,但显然,我所做的所有阅读都表明这应该是可能的。
编辑: 我需要在 CompositeTuple 中有更多方法可以访问 T 和 tupleSize 模板参数。像这样的东西:
编辑 2: 尝试按照 Igor 的建议添加模板化构造函数:
我现在在 CreateCompositeTuple 函数中出现“不完整类型的无效使用”错误。
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) 的行。如果我将它们注释掉,在这些情况下我会得到同样的歧义错误:
参考文献
c++ - C++:通用(转发)参考中不允许使用 const
我正在阅读这个 stackoverflow 答案const T&&
,其中给出了不是通用(转发)参考的一个原因:
允许 const T&& 充当转发引用,将无法重载仅将右值引用作为参数的模板函数。
我不知道这是什么意思。我猜这意味着同一函数(模板)有两个重载,其中一个作为参数const T&&
。我还假设将始终调用其中一个重载,而永远不会调用另一个。
如果我的假设是正确的,那两个重载函数是什么?或者如果我错了,引用的段落实际上是什么意思?
谢谢你。
c++ - 返回右值引用的原因
我看到一个定义如下的类:
我想不出任何返回函数类型的充分理由addElement()
。返回右值引用是否有意义,或者这不是一个好主意?如果是这样,这样做的潜在原因是什么?
c++ - 如何返回转发参考?
返回前向(通用)引用的最自然方式是什么?
我想到的情况是构造并立即使用的类似流的对象。例如:
c++ - std::enable_if 和通用引用的使用差异
我试图std::enable_if
更好地理解通用引用,但我对我的代码中发生的事情有点困惑。
首先,我注意到人们似乎以std::enable_if
两种不同的方式使用:
template<typename T, std::enable_if<condition, T>::type* = nullptr>
或类似的东西。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_integral
and decay
,你可以在开头看到main
。我得到输出:
true: unsigned long
false: unsigned long
false: unsigned long
false: unsigned long
我不知道为什么最后三个是假的。
然后我遇到了问题(在下面的源代码中标记为 1 和 2),当以enable_if
上述两种方式中的任何一种使用时,它们在接受整数或浮点类型的左值时拒绝编译。
为简洁起见,省略了标题和类型打印代码:
任何人都可以给我关于两种不同用途enable_if
以及为什么我的代码enable_if
拒绝接受左值的任何见解,将不胜感激。
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 放入被调用者。这真的是一回事,因为他们都是美化的演员。
现在,假设我使用了标准转发,因为我真的很喜欢我的容器不会去任何地方。
我可以很容易地看到被调用者没有意识到我的意图,并在调用后移动我的容器使其无效(内脏)。这是语言缺陷还是我错过了什么?