问题标签 [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代码重复
在我的项目中,我有这样的功能:
这通过复制Pair
将.VectorList
Pair
我可以这样使用它:
但是在第二种情况下,创建了一个不必要的对象,所以我想做
我检查了这是如何在向量(gcc,llvm)中完成的,两种方法中都有 100% 相同的代码,除了 equal / std::move() 行。
有没有什么方法可以在不重复代码的情况下做到这一点?
put()
看起来类似于:
c++ - 如何正确传播通用引用的类型?
我的代码库中有一种情况,我必须实现一种通用形式,std::get()
该形式适用于任何类型的 Tuple-like 类型。该函数接受对 a 的通用引用Tuple
并返回对 的I
第 th 元素的引用Tuple
。我不知道如何命名引用的类型。不幸的是,我无法使用auto
返回类型,只能让编译器弄清楚。
这是我的第一次尝试:
Clang 拒绝这个程序:
我怀疑问题出在我实例化的方式上get_result
。我究竟做错了什么?
c++ - const 应用于“通用参考”参数
我偶然发现了 Scott Mayers 关于通用参考的文章,链接。
根据我对通用参考的理解,某种T&&
类型在不同的上下文中可能意味着右值或左值类型。
例如:
在上面的示例中,取决于模板参数,T&&
它可以是左值或右值,也就是说,这取决于我们如何调用f
然而,根据 Scott 的说法,如果我们应用于const
上面的示例,则类型T&&
始终是右值:
引用文章:
即使简单地添加 const 限定符也足以禁用将“&&”解释为通用引用:
问题:
为什么要const
制作“通用”参考右值?
我认为这是不可能的,因为下面的代码会造成混淆:
c++ - 如何将类型约束和隐式转换与 C++11 通用引用结合起来?
在函数中,我需要区分左值和右值引用,因此明显的路径是重载:
这完全具有所需的行为,具有明确定义的类型和隐式转换。但是有太多的代码重复,我更愿意将相关决策封装在里面,只保留一个函数,因此通过通用引用传递可能是一种选择:
然而,这有一个不幸的缺点,现在任何对象都可以作为第一个参数传递,因此可以通过 enable_if 施加约束:
这似乎可以完成这项工作,但是(我猜已经通过模板化了)我们失去了一个很好的重载属性,它可以触发隐式转换构造函数到类型 A(比如从类型 C 参数)。重载不是一个选项,因为某些函数可能有 3 个或更多 A&& 参数,无意处理组合爆炸。可以以某种方式恢复隐式转换吗?当然,一种解决方法可能是例如为 A 添加其他允许的参数类型,并在主函数中执行任何需要的转换,但这是侵入性的、丑陋的、显式隐含并产生混淆(原始 C 参数可能是左值 [参考]并通过转换产生一个右值)。有更好的办法吗?
c++ - 为什么要转发的 args 的 make_shared 和 allocate_shared 的签名不同?
为了给std::shared_ptr
给定的类型创建一个T
,有两种方法:std::allocate_shared
和std::make_shared
。
主要区别(或者至少,我对此问题感兴趣的那个)是前者通过给定分配器的副本进行所有内存分配。
从文档中,std::allocate_shared
具有以下签名:
另一方面,std::make_shared
被描绘为:
对于他们俩来说,都指出:
args... - 构造 T 实例的参数列表。
从现在开始,一切似乎都是正确的(额外的分配器、参数等)。
无论如何,据我所知,他们都应该将参数声明为通用引用,但事实并非如此(至少,从我在文档中看到的)。
换句话说,签名不std::allocate_shared
应该是以下吗?
他们不同是正确的还是那个网站的错误?
如果这是第一种情况,我在推理中遗漏了什么?
c++ - 这段代码中 && 的优点是什么?
在下面的代码中,使用的好处是&&
什么?该代码来自针对不同特征的 Specialize same operator 的回答
从这个问题,我得到一个&&
参数意味着它是一个可以被函数修改的引用。
可能会阻止编译器将对变量的decay_t
引用解释为数组,如什么是 std::decay 以及何时应该使用它?
std::forward
是这里描述的完美转发。为什么我们需要这个转发?
谢谢。
c++ - 通用引用和转发引用之间有区别吗?
此函数的参数将绑定到右值引用:
但是,此函数的参数将绑定到右值或左值引用:
我经常听到这被称为通用参考。
我也听说它被称为转发参考。
他们的意思是一样的吗?
如果函数体调用,它只是一个转发引用std::forward
吗?
c++ - 从 std::vector 移动元素到 std::vector>
将元素从某种类型(T1)的向量 std::move 到相同类型(T1)和另一种类型(T2)的 std::pair 向量中的最正确和最有效的方法是什么?
换句话说,我应该如何编写 MoveItems()?
感谢您的时间和帮助,我真的很感激!
c++ - 模板类型错误的通用参考
原谅标题不好...
所以,通常在这样的函数中:
T&&
是通用参考。在这样的上下文中,它是一个右值引用:
这是有道理的,因为T
它是一个固定类型s
,它f()
是一个方法。
但是,显然在这种情况下:
T&&
也是一个右值引用。但是,这种情况与上述情况不同。T&&
那么,这里也是右值引用而不是通用引用的原因是什么?