问题标签 [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.

0 投票
3 回答
118 浏览

c++ - 通用参考c++11代码重复

在我的项目中,我有这样的功能:

这通过复制Pair将.VectorListPair

我可以这样使用它:

但是在第二种情况下,创建了一个不必要的对象,所以我想做

我检查了这是如何在向量(gcc,llvm)中完成的,两种方法中都有 100% 相同的代码,除了 equal / std::move() 行。

有没有什么方法可以在不重复代码的情况下做到这一点?


put()看起来类似于:

0 投票
1 回答
1828 浏览

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

0 投票
1 回答
144 浏览

c++ - 如何正确传播通用引用的类型?

我的代码库中有一种情况,我必须实现一种通用形式,std::get()该形式适用于任何类型的 Tuple-like 类型。该函数接受对 a 的通用引用Tuple并返回对 的I第 th 元素的引用Tuple。我不知道如何命名引用的类型。不幸的是,我无法使用auto返回类型,只能让编译器弄清楚。

这是我的第一次尝试:

Clang 拒绝这个程序:

我怀疑问题出在我实例化的方式上get_result。我究竟做错了什么?

0 投票
0 回答
365 浏览

c++ - const 应用于“通用参考”参数

我偶然发现了 Scott Mayers 关于通用参考的文章,链接

根据我对通用参考的理解,某种T&&类型在不同的上下文中可能意味着右值或左值类型。

例如:

在上面的示例中,取决于模板参数,T&&它可以是左值或右值,也就是说,这取决于我们如何调用f

然而,根据 Scott 的说法,如果我们应用于const上面的示例,则类型T&&始终是右值:

引用文章:

即使简单地添加 const 限定符也足以禁用将“&&”解释为通用引用:

问题: 为什么要const制作“通用”参考右值?

我认为这是不可能的,因为下面的代码会造成混淆:

0 投票
1 回答
212 浏览

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

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

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

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

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

0 投票
0 回答
123 浏览

c++ - 为什么要转发的 args 的 make_shared 和 allocate_shared 的签名不同?

为了给std::shared_ptr给定的类型创建一个T,有两种方法:std::allocate_sharedstd::make_shared
主要区别(或者至少,我对此问题感兴趣的那个)是前者通过给定分配器的副本进行所有内存分配。

从文档中,std::allocate_shared具有以下签名:

另一方面,std::make_shared被描绘为:

对于他们俩来说,都指出:

args... - 构造 T 实例的参数列表。

从现在开始,一切似乎都是正确的(额外的分配器、参数等)。
无论如何,据我所知,他们都应该将参数声明为通用引用,但事实并非如此(至少,从我在文档中看到的)。

换句话说,签名不std::allocate_shared应该是以下吗?

他们不同是正确的还是那个网站的错误?
如果这是第一种情况,我在推理中遗漏了什么?

0 投票
1 回答
363 浏览

c++ - 这段代码中 && 的优点是什么?

在下面的代码中,使用的好处是&&什么?该代码来自针对不同特征的 Specialize same operator 的回答

这个问题,我得到一个&&参数意味着它是一个可以被函数修改的引用。

可能会阻止编译器将对变量的decay_t引用解释为数组,如什么是 std::decay 以及何时应该使用它?

std::forward是这里描述的完美转发。为什么我们需要这个转发?

谢谢。

0 投票
2 回答
21525 浏览

c++ - 通用引用和转发引用之间有区别吗?

此函数的参数将绑定到右值引用:

但是,此函数的参数将绑定到右值或左值引用:

我经常听到这被称为通用参考。
我也听说它被称为转发参考。
他们的意思是一样的吗?
如果函数体调用,它只是一个转发引用std::forward吗?

0 投票
2 回答
126 浏览

c++ - 从 std::vector 移动元素到 std::vector>

将元素从某种类型(T1)的向量 std::move 到相同类型(T1)和另一种类型(T2)的 std::pair 向量中的最正确和最有效的方法是什么?

换句话说,我应该如何编写 MoveItems()?

感谢您的时间和帮助,我真的很感激!

0 投票
1 回答
105 浏览

c++ - 模板类型错误的通用参考

原谅标题不好...

所以,通常在这样的函数中:

T&&是通用参考。在这样的上下文中,它是一个右值引用:

这是有道理的,因为T它是一个固定类型s,它f()是一个方法。

但是,显然在这种情况下:

T&&也是一个右值引用。但是,这种情况与上述情况不同。T&&那么,这里也是右值引用而不是通用引用的原因是什么?