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

0 投票
4 回答
65651 浏览

c++ - auto&& 告诉我们什么?

如果您阅读类似的代码

auto&& var = foo();

foo任何按类型值返回的函数在哪里T。然后var是一个右值引用类型的左值T。但这意味着var什么?这是否意味着,我们可以窃取资源var?是否有任何合理的情况,您应该使用auto&&类似的方式告诉读者您的代码,就像您在返回 aunique_ptr<>以告知您拥有独占所有权时所做的那样?例如什么T&&时候T是类类型?

auto&&我只是想了解,除了模板编程之外,是否还有其他用例;就像Scott Meyers 的文章Universal References中的示例中讨论的那样。

0 投票
3 回答
2879 浏览

c++ - 通用引用的语法

这是一个右值引用:

它不绑定到左值:

这是一个通用参考:

它绑定到右值,也绑定到左值:

这是一个右值引用:

它不绑定到左值:

为什么通用引用使用与右值引用相同的语法?这不是不必要的混乱来源吗?委员会是否考虑过替代语法,例如,T&&&或(只是在开玩笑)?如果是这样,拒绝替代语法的原因是什么?T&*T@T&42

0 投票
1 回答
2085 浏览

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.

0 投票
1 回答
373 浏览

c++ - 左值参数是否更喜欢左值引用参数而不是通用引用?

在使用通用引用时,我遇到了这种情况,clang 和 gcc 在重载解决方案上存在分歧。

gcc 报告上面的调用不明确。但是,clang选择了T&重载并成功编译。

哪个编译器错了,为什么?

编辑:
在 VS2013 Preview 上测试了相同的代码,它与 clang 一致;除了 Intellisense,它在 gcc 方面:-)

0 投票
1 回答
1287 浏览

c++ - 接收器参数的按值传递或按通用引用传递?


写。建议的重复“在 C++11 中传递值是合理的默认值吗?” - 那里的问题答案都没有提到“通用参考”构造函数版本,所以真的看不到重复。考虑重新开放。


我正在熟悉移动语义,并尝试使用它。请看一下这段(可编译的)代码:

输出:

http://coliru.stacked-crooked.com/a/3be77626b7ca6f2c

在这两种情况下,这两个功能都可以完成正确的工作。按值函数再次调用移动构造函数,但这应该很便宜。您能否评论一下哪种模式应该优先于另一种模式的情况?

0 投票
2 回答
2318 浏览

c++ - 正确使用通用参考

在c++11之前,我曾经写过这样的代码:

但是现在,有了移动语义,允许我的函数将右值引用作为参数并添加这些重载可能会变得有趣(至少在某些情况下):

从我收集到的信息来看,如果我希望能够在我的大函数中调用这些重载,我需要使用完美转发,它可能看起来像这样(它的可读性有点低,但我想它可以用模板类型的良好命名约定):

我的问题是这样的:这是否意味着如果我的小函数有其他重载,就可以使用不打算使用的类型参数调用大函数?

我认为这可能有助于防止这种情况:

虽然我不确定它是否不太严格,因为如果我尝试使用可隐式转换为 A、B 或 C 的类型调用大函数,我不知道它的行为...

但是......即使假设这有效,我真的没有其他选择吗?(我的意思是......这对眼睛来说并不容易)

0 投票
2 回答
214 浏览

c++ - 通用引用和本地类

在下面的代码中,我有一个接受“通用引用”(F&&)的函数。该函数还有一个内部类,它F&&在其构造函数中接受一个对象。F&&那时仍然是通用参考吗?ieF仍然被认为是推导类型?

换句话说,我应该在构造函数初始化列表中使用std::forward<F>还是?std::move

现场演示。

0 投票
3 回答
1647 浏览

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真的重要的争论,有些人说除了移动/交换原语之外不要太担心它:

也许对于概念来说,约束模板不会太难,只是为了改进错误消息。

这仍然有缺点,它不能是虚拟的,并且它必须在标题中(尽管希望模块最终会渲染那个没有实际意义的),但这似乎相当可教。

0 投票
1 回答
16021 浏览

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 :...)or for(auto &e:...),并且仅在需要时才不要使用引用。

0 投票
1 回答
418 浏览

c++ - 使用默认参数转发参考?

我在试图弄清楚如何为转发引用(以前被 Scott Meyers称为通用引用)指定默认参数时遇到了麻烦。

这是尝试做我想做的事情的代码示例:

也可在 Coliru 上获得

通过错误处理,您发现可以通过默认模板参数使其工作,然后在其后默认构造参数:

也在 Coliru 上

这是处理这个问题的“正确”方式吗?我应该使用什么语法?是否有多种方法可以达到“默认转发引用”的预期效果?我应该以哪种方式写这个?还要记住,稍后我将在代码上撒上大量的 SFINAE,所以我更喜欢不包括编写多个重载的东西。