forwarding-reference相关内容

结构化绑定和转发引用能很好地混合吗?

我知道我可以做到 auto&& bla = something(); 根据something返回值的const程度,我会为bla获取不同的类型。 这是否也适用于结构化绑定的情况,例如 auto&& [bla, blabla] = something(); 我想是的(结构化绑定搭载在auto初始值设定项上,其行为如下),但我找不到明确的“是”。 更新:初步测试似乎达到 ..

如何创建一个多次使用一个值而不复制它的宏?

我想创建一个宏,将一对解包成两个局部变量.如果它只是一个变量,我不想创建该对的副本,这将完成: #define UNPACK_PAIR(V1, V2, PAIR) \汽车&V1 = PAIR.first;\汽车&V2 = PAIR.秒;UNPACK_PAIR(一,二,x); 但是,我也希望它不计算多次给出的表达式,例如这应该只调用一次 expensive_computation(): UNP ..
发布时间:2022-01-11 20:10:57 C/C++开发

什么是`auto &&e` 在基于范围的 for 循环中做什么?

假设我在使用基于范围的循环编程时的当前规则说 尽可能使用 for(auto const &e :...) 或 for(auto &e:...) 而不是 for(自动 a: ...). 我以我自己的经验和这个问题为例. 但是在阅读了新的 简洁的循环 我想知道,我不应该用 && 替换我的规则中的 & 吗?正如此处所写,这看起来像Meyers 的通用参考文献. 所以,我问自己,我 ..

什么是 auto&&告诉我们?

如果你读过类似的代码 auto&&var = foo(); 其中 foo 是按 T 类型的值返回的任何函数.那么 var 是对 T 的右值引用类型的左值.但这对 var 意味着什么?这是否意味着,我们可以窃取var的资源?是否有任何合理的情况,您应该使用 auto&& 来告诉代码的读者,就像您返回 unique_ptr 一样告诉您拥有独家所有权?当 T 是类类型时,例如 T&& 怎 ..
发布时间:2021-11-30 18:09:43 C/C++开发

如何使用模板推导类型获得右值和左值引用的不同重载?

我有一个函数 foo 通过引用获取参数,我希望它对右值和左值引用有不同的作用.(我还应该提到 foo() 尊重常量性;它不会改变引用的值.)我知道如果我写: template foo(T&& x); 我已声明转发参考,而不是右值引用,意思是这样: template foo(const T& x);模板 foo(T&& x); 可能得不到我想要的. 所以,我的问题是:影响两种引用之间不 ..

转发引用是否仍然是右值引用?

我仍然对为支持移动和转发而发明的规则感到困惑.我仍然不确定的一件事是: 是转发参考,只是右值参考(带有是否应用了参考折叠规则)? 如果它是右值引用,那么为什么要执行该功能: templatevoid func(T&); 不仅接受右值,还接受左值吗? 解决方案 (显然)在替换 T 之前, T&&是右值引用./p> 在替换 T 之后(并且折叠引用 ..
发布时间:2021-04-19 20:25:10 C/C++开发

C ++转发参考和R值参考

我知道转发引用是“对cv不合格模板参数的右值引用",例如 模板无效foo(T&) 这意味着上面的函数可以同时使用l值和r值引用. 有些事情我不理解,例如 模板A级{模板无效的foo(T& t,U& u){T t2(std :: forward(t));//还是应该是std :: move(t)?是T&&转发或右值参考U u2 ..
发布时间:2021-04-19 19:14:16 C/C++开发

完美转发设置器上正确的`enable_if`约束是什么?

Herb Sutter的回到基础知识! CppCon上的Modern C ++ 的要点讨论了传递参数的不同选项,并比较了它们的性能与编写/教学的难易程度. “高级"选项(在所有测试的情况下都提供了最佳性能,但是对于大多数开发人员而言太难了)是完美的转发,示例给出了class employee { std::string name_; public: template ..

为什么添加const将通用引用作为右值

我一直在阅读Scott的上一本有关c ++ 11和14的杰作中的通用引用,尽管尽管将参数分配给左值或右值类型引用参数,但在两者之间还是有一些东西被称为通用引用,可以根据传递的参数的类型特征推导出为l/rvalue.我能理解是什么使该参数成为通用引用,但我不清楚的一件事是为什么在类型参数const T&& p中添加const会使p成为右值: template void ..
发布时间:2020-07-26 04:15:36 C/C++开发

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

此函数的参数将绑定到右值引用: void f(int && i); 但是,此函数的参数将绑定到右值或左值引用: template void f(T && t); 我经常听到这被称为通用参考书. 我也听说过它被称为转发参考. 他们是同一回事吗? 如果函数主体调用std::forward,它是否只是转发参考? 解决方案 它们是同一意思 ..

Lambda通过引用捕获右值引用

下面的代码标准正确吗? ( godbolt ) 即by-ref捕获表示临时引用的转发引用,并从函数在同一表达式内返回结果的lambda按值. 当然,存储lambda供以后使用会使它包含一个悬挂的引用,但是我指的是main内部的确切用法. 我对此SO答案以及可能的“标准引用中的引用捕获生存期规则捕获了变量,而不是数据及其作用域". –这似乎表明捕获的对临时变量的引用在以下情况下可能 ..
发布时间:2020-07-10 22:57:53 C/C++开发

如何创建一个多次使用一个值的宏,而不复制它?

我想创建一个宏,将一对分解为两个局部变量.如果它只是一个变量,我不想创建该对的副本,这将完成: #define UNPACK_PAIR(V1, V2, PAIR) \ auto& V1 = PAIR.first; \ auto& V2 = PAIR.second; UNPACK_PAIR(one, two, x); 但是,我也希望它不评估多次给出的表达式,例如这应该只调 ..
发布时间:2020-05-05 08:54:17 C/C++开发