问题标签 [perfect-forwarding]

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 投票
2 回答
75 浏览

c++ - C++:在基础对象列表中,派生内存在通过引用传递时会产生意想不到的结果

我在真正理解使用引用而不是指针的限制时遇到了一些麻烦:如何将没有虚函数的派生对象(只有一个数据元组)传递到基于对象的列表中?

在我的应用程序中,有一个事件对象和一个队列:

当我将队列中的对象转换为它们的原始类型时,我在所有变量中都得到了未定义的值,而指针从未发生过这种情况。所以基本上,

给我胡言乱语:http: //ideone.com/rbzGJV

有没有办法在不使用指针的情况下解决这个问题?有没有办法在容器内有引用std::queue

0 投票
2 回答
1162 浏览

c++ - 转发到就地构造函数

我有一个消息类,以前使用它有点痛苦,你必须构造消息类,告诉它为你的对象分配空间,然后通过构造或成员填充空间。

我希望可以使用生成的对象的即时、内联 new 来构造消息对象,但要在调用站点使用简单的语法,同时确保复制省略。

在 C++11 之前,我有一个讨厌的宏 CONSTRUCT_IN_PLACE,它做了:

你会说:

使用 C++11,您可以使用

但我觉得这很混乱。我要实现的是:

以便用户使用

但似乎这首先MyStruct在堆栈上构造了一个临时对象,将就地new转换为对 T 的移动构造函数的调用。

其中许多消息很简单,通常是 POD,它们通常在编组函数中,如下所示:

所以我想避免创建一个需要后续移动/复制的中间临时文件。

似乎编译器应该能够消除临时和移动,并将构造一直向下推进到就地new

我在做什么导致它不这样做?(GCC 4.8.1、Clang 3.5、MSVC 2013)

0 投票
4 回答
420 浏览

c++ - 不转发通用引用会出现什么样的问题?

据我所知,在 C++11 中,通用引用应始终与 一起使用std::forward,但我不确定如果std::forward不使用会出现什么样的问题。

您能否提供一些在这种情况下可能出现的问题的说明?

0 投票
1 回答
151 浏览

c++ - 通过通用引用传递的函数的 std::forward?

考虑以下两个:

在什么情况下有区别,具体区别是什么?

0 投票
2 回答
2701 浏览

c++ - std::forward 之间有什么区别和 std::forward?

这些功能是否等效?

如果是,我可以始终使用此宏进行完美转发吗?

或者只是使用

我相信foo2并且foo3是一样的,但是我发现人们总是使用 forward like foo,有什么理由明确写出类型吗?

我理解T并且T&&是两种不同的类型,但我认为std::forward<T>并且std::forward<T&&>总是给出相同的结果?


编辑:

我想使用宏的原因是我想在下面的 C++1y 代码上节省一些输入,我在不同的地方有很多类似的代码

0 投票
3 回答
231 浏览

c++ - 是否可以在不使用 SFINAE 或编写多个版本的情况下完美地转发“非泛型”类型?

我了解在通常情况下完美转发的工作原理:

是否可以完美地转发“非通用”类型,例如某种形式的std::string不使用 SFINAE 或编写多个版本?

以下应该是正确的:

我怀疑唯一的方法是仍然编写一个函数模板并使用某种形式的 SFINAE 来限制它(在这种情况下我可以自己想办法),但我想知道是否有一些简单的方法可以让我我失踪了。

0 投票
1 回答
84 浏览

c++11 - 在这种情况下完美转发

我目前正在阅读有关完美转发的文章,它指出完美转发的目的是将左值作为左值传递,将右值作为右值传递。所以我用下面的例子来理解完美转发。这里的foo对象有一个复制和移动 cnstr,它也有一个复制和移动赋值运算符。

现在我在 VS2012 中测试这段代码,移动构造函数只被调用一次。我期待它被调用两次。如果有人可以向我解释这一点,我将不胜感激。我希望在中继调用第一个移动构造函数,在 mfoo 调用下一个移动构造函数

0 投票
1 回答
502 浏览

c++ - 了解这个完美的转发示例

std::forward我在尝试了解以下示例时遇到了以下示例

程序的输出是

用右值调用 fn:[左值][右值]

现在我的问题是我们是如何获得lvalue第一的?这是我在main我称为fn(0);Now 0 is rvalue 中的思路。因此,通用参考 x 被推导出为以下

现在根据参考折叠我们会得到

从而使x行为像右值。因此,如果x传递,则应调用右值重载方法。然而,似乎调用了另一个重载的左值引用函数。如果有人能澄清这一点,我将不胜感激

0 投票
1 回答
94 浏览

c++ - (C++11) 可变模板函数转发给另一个

我正在尝试将我的尾巴从 to 转发parseradd_option但 GCC 不允许这样做:

相反,GCC 给了我这个错误:

谁能告诉我我在这里做错了什么?我怎样才能解决这个问题?

0 投票
0 回答
81 浏览

c++ - STL算法的参考友好性

假设我们有一个函子,它包含几个不同的 ref 限定或简单的 const 限定重载operator ()。我想为使用 STL 算法的不同上下文调用不同的算法。也就是说,我想根据operator ()我提供给 STL 算法的仿函数值/引用的常量或“左值/右值”来正确重载要调用的函数。说,有假设算法recurrent_all_of。我可能期望在 STL 中找到的形式是:

但是为了满足引用友好的要求,表格应该如下:

有什么误解吗?为什么 STL 算法不是这样设计的?