问题标签 [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++ - auto&& 告诉我们什么?
如果您阅读类似的代码
auto&& var = foo();
foo
任何按类型值返回的函数在哪里T
。然后var
是一个右值引用类型的左值T
。但这意味着var
什么?这是否意味着,我们可以窃取资源var
?是否有任何合理的情况,您应该使用auto&&
类似的方式告诉读者您的代码,就像您在返回 aunique_ptr<>
以告知您拥有独占所有权时所做的那样?例如什么T&&
时候T
是类类型?
auto&&
我只是想了解,除了模板编程之外,是否还有其他用例;就像Scott Meyers 的文章Universal References中的示例中讨论的那样。
c++ - 通用引用的语法
这是一个右值引用:
它不绑定到左值:
这是一个通用参考:
它绑定到右值,也绑定到左值:
这是一个右值引用:
它不绑定到左值:
为什么通用引用使用与右值引用相同的语法?这不是不必要的混乱来源吗?委员会是否考虑过替代语法,例如,T&&&
或(只是在开玩笑)?如果是这样,拒绝替代语法的原因是什么?T&*
T@
T&42
c++ - Pass by value or universal reference
I want to develop a small polymorphic class with type erasure and I wonder which version of the templatized constructor is better and should be used.
We can pass by value:
or we can use a universal reference:
(The universal reference has to be enabled if for the case that T
is not the class itself and the class is not copied). Any ideas? Both version look equal to me.
c++ - 接收器参数的按值传递或按通用引用传递?
写。建议的重复“在 C++11 中传递值是合理的默认值吗?” - 那里的问题和答案都没有提到“通用参考”构造函数版本,所以我真的看不到重复。考虑重新开放。
我正在熟悉移动语义,并尝试使用它。请看一下这段(可编译的)代码:
输出:
http://coliru.stacked-crooked.com/a/3be77626b7ca6f2c
在这两种情况下,这两个功能都可以完成正确的工作。按值函数再次调用移动构造函数,但这应该很便宜。您能否评论一下哪种模式应该优先于另一种模式的情况?
c++ - 正确使用通用参考
在c++11之前,我曾经写过这样的代码:
但是现在,有了移动语义,允许我的函数将右值引用作为参数并添加这些重载可能会变得有趣(至少在某些情况下):
从我收集到的信息来看,如果我希望能够在我的大函数中调用这些重载,我需要使用完美转发,它可能看起来像这样(它的可读性有点低,但我想它可以用模板类型的良好命名约定):
我的问题是这样的:这是否意味着如果我的小函数有其他重载,就可以使用不打算使用的类型参数调用大函数?
我认为这可能有助于防止这种情况:
虽然我不确定它是否不太严格,因为如果我尝试使用可隐式转换为 A、B 或 C 的类型调用大函数,我不知道它的行为...
但是......即使假设这有效,我真的没有其他选择吗?(我的意思是......这对眼睛来说并不容易)
c++ - 通用引用和本地类
在下面的代码中,我有一个接受“通用引用”(F&&
)的函数。该函数还有一个内部类,它F&&
在其构造函数中接受一个对象。F&&
那时仍然是通用参考吗?ieF
仍然被认为是推导类型?
换句话说,我应该在构造函数初始化列表中使用std::forward<F>
还是?std::move
c++ - 完美转发设置器的正确“enable_if”约束是什么?
Herb Sutter回归本源!CppCon上的现代 C++演示要点讨论了传递参数的不同选项,并比较了它们的性能与编写/教学的容易程度。“高级”选项(在所有测试案例中提供最佳性能,但对于大多数开发人员来说太难编写)是完美的转发,给出的示例(PDF,第 28 页):
该示例使用带有转发引用的模板函数,模板参数String
使用enable_if
. 然而,约束似乎是不正确的:似乎是说只有当String
类型不是 a时才可以使用这种方法std::string
,这是没有意义的。这意味着std::string
可以使用除值之外的任何内容来设置此成员std::string
。
我考虑的一种解释是,有一个简单的错字,并且该约束旨在std::is_same<std::decay_t<String>, std::string>::value
代替!std::is_same<std::decay_t<String>, std::string>::value
. 但是,这意味着 setter 不能用于例如,const char *
并且鉴于这是演示文稿中测试的案例之一,它显然打算与这种类型一起使用。
在我看来,正确的约束更像是:
允许任何可以分配给成员的内容与 setter 一起使用。
我有正确的约束吗?还有其他可以改进的地方吗?对原始约束是否有任何解释,也许是断章取义?
另外我想知道这个声明中复杂的、“不可教的”部分是否真的那么有益。由于我们没有使用重载,我们可以简单地依赖正常的模板实例化:
当然还有一些关于是否noexcept
真的重要的争论,有些人说除了移动/交换原语之外不要太担心它:
也许对于概念来说,约束模板不会太难,只是为了改进错误消息。
这仍然有缺点,它不能是虚拟的,并且它必须在标题中(尽管希望模块最终会渲染那个没有实际意义的),但这似乎相当可教。
c++ - `auto && e` 在基于范围的 for 循环中有什么作用?
在使用基于范围的循环进行编程时假设我当前的规则说
尽可能使用
for(auto const &e :...)
或for(auto &e:...)
结束for(auto a: ...)
。
我基于我自己的经验和这个问题,例如。
但是在阅读了新的简洁 for 循环&
之后,我想知道,我不应该在我的规则中用替换我的&&
吗?正如这里所写,这看起来像Meyers 的 Universal References。
所以,我问自己,我的新规则是否应该是
使用
for(auto const &&e :...)
或for(auto &&e:...)
尽可能...
或者这并不总是有效,因此应该是相当复杂的
检查
for(auto const &&e :...)
orfor(auto &&e:...)
是否可能,然后考虑for(auto const &e :...)
orfor(auto &e:...)
,并且仅在需要时才不要使用引用。
c++ - 使用默认参数转发参考?
我在试图弄清楚如何为转发引用(以前被 Scott Meyers称为通用引用)指定默认参数时遇到了麻烦。
这是尝试做我想做的事情的代码示例:
通过错误处理,您发现可以通过默认模板参数使其工作,然后在其后默认构造参数:
这是处理这个问题的“正确”方式吗?我应该使用什么语法?是否有多种方法可以达到“默认转发引用”的预期效果?我应该以哪种方式写这个?还要记住,稍后我将在代码上撒上大量的 SFINAE,所以我更喜欢不包括编写多个重载的东西。