问题标签 [universal-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++ - 不转发通用引用会出现什么样的问题?
据我所知,在 C++11 中,通用引用应始终与 一起使用std::forward
,但我不确定如果std::forward
不使用会出现什么样的问题。
您能否提供一些在这种情况下可能出现的问题的说明?
c++ - 通过通用引用传递的函数的 std::forward?
考虑以下两个:
和
在什么情况下有区别,具体区别是什么?
c++ - 使用来自通用引用的模板参数作为 const ref
我的实际用例需要更多参数,但它简化为:
很明显,Arg1 将以某种方式崩溃并可能成为某种参考。p1 也是算法的输出,因此如果调用者选择传入左值,函数将返回并修改原始参数以反映它停止的位置。
但是 p2 是同一类型,但永远不会被修改。所以实际上我想在那里放一个“const”承诺以确保正确性。显然,如果 Arg1 推断为参考,我不能将 const 添加到它。
所以我的解决方案是这样的:
它经历了一堆愚蠢的阴谋来删除一些限定符,然后重新粘贴 const& 。
所以我的问题是:
1)这是最好的方法吗?
2) 是否存在这将失败的上下文?现在对我来说似乎还不错。
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++ - 为什么 C++ 没有 const 通用引用?
Scott Meyers说(对于函数模板的参数):
通用引用只能以“
T&&
”的形式出现!即使简单地添加const
限定符也足以禁用将“&&
”解释为通用参考。
为什么 C++ 没有const
通用引用?有什么技术原因吗?
c++ - C++ 无法使用通用引用移动 unique_ptr
考虑这段代码:
该mov
函数应该简单地获取一个通用引用并按值返回它,move
而不是复制它。因此,调用此方法时不应涉及复制。unique_ptr
因此,使用只能移动的 a 调用这样的函数应该没问题。但是,此代码无法编译:我收到错误:
所以似乎 C++ 试图调用unique_ptr
当然被删除的复制构造函数。但是为什么这里会出现副本呢?我怎样才能让这段代码编译?
c++ - 获得通用参考的优势,无需通用参考
问题
让我们假设一个函数func
接受表单中的任何容器Container<Type, N, Args...>
(即一个容器,它将第一个模板参数作为一个类型,作为第二个std::size_t
定义容器中有多少个参数)并返回其i
第 th 个元素当且仅当N
介于40
和42
.
这种容器的一个例子是std::array
.
我的第一个版本的函数将是:
然后我需要一个const
重载:
问题
是否可以定义类似的东西(这不起作用,因为这不是通用参考):
为了定义这个函数的单一版本,并且 make 对两者都Container<Type, N, Args...>&
有效const Container<Type, N, Args...>&
?