问题标签 [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.
c++ - C++:在基础对象列表中,派生内存在通过引用传递时会产生意想不到的结果
我在真正理解使用引用而不是指针的限制时遇到了一些麻烦:如何将没有虚函数的派生对象(只有一个数据元组)传递到基于对象的列表中?
在我的应用程序中,有一个事件对象和一个队列:
当我将队列中的对象转换为它们的原始类型时,我在所有变量中都得到了未定义的值,而指针从未发生过这种情况。所以基本上,
给我胡言乱语:http: //ideone.com/rbzGJV
有没有办法在不使用指针的情况下解决这个问题?有没有办法在容器内有引用std::queue
?
c++ - 转发到就地构造函数
我有一个消息类,以前使用它有点痛苦,你必须构造消息类,告诉它为你的对象分配空间,然后通过构造或成员填充空间。
我希望可以使用生成的对象的即时、内联 new 来构造消息对象,但要在调用站点使用简单的语法,同时确保复制省略。
在 C++11 之前,我有一个讨厌的宏 CONSTRUCT_IN_PLACE,它做了:
你会说:
使用 C++11,您可以使用
但我觉得这很混乱。我要实现的是:
以便用户使用
但似乎这首先MyStruct
在堆栈上构造了一个临时对象,将就地new
转换为对 T 的移动构造函数的调用。
其中许多消息很简单,通常是 POD,它们通常在编组函数中,如下所示:
所以我想避免创建一个需要后续移动/复制的中间临时文件。
似乎编译器应该能够消除临时和移动,并将构造一直向下推进到就地new
。
我在做什么导致它不这样做?(GCC 4.8.1、Clang 3.5、MSVC 2013)
c++ - 不转发通用引用会出现什么样的问题?
据我所知,在 C++11 中,通用引用应始终与 一起使用std::forward
,但我不确定如果std::forward
不使用会出现什么样的问题。
您能否提供一些在这种情况下可能出现的问题的说明?
c++ - 通过通用引用传递的函数的 std::forward?
考虑以下两个:
和
在什么情况下有区别,具体区别是什么?
c++ - std::forward 之间有什么区别和 std::forward?
这些功能是否等效?
如果是,我可以始终使用此宏进行完美转发吗?
或者只是使用
我相信foo2
并且foo3
是一样的,但是我发现人们总是使用 forward like foo
,有什么理由明确写出类型吗?
我理解T
并且T&&
是两种不同的类型,但我认为std::forward<T>
并且std::forward<T&&>
总是给出相同的结果?
编辑:
我想使用宏的原因是我想在下面的 C++1y 代码上节省一些输入,我在不同的地方有很多类似的代码
c++ - 是否可以在不使用 SFINAE 或编写多个版本的情况下完美地转发“非泛型”类型?
我了解在通常情况下完美转发的工作原理:
是否可以完美地转发“非通用”类型,例如某种形式的std::string
不使用 SFINAE 或编写多个版本?
以下应该是正确的:
我怀疑唯一的方法是仍然编写一个函数模板并使用某种形式的 SFINAE 来限制它(在这种情况下我可以自己想办法),但我想知道是否有一些简单的方法可以让我我失踪了。
c++11 - 在这种情况下完美转发
我目前正在阅读有关完美转发的文章,它指出完美转发的目的是将左值作为左值传递,将右值作为右值传递。所以我用下面的例子来理解完美转发。这里的foo
对象有一个复制和移动 cnstr,它也有一个复制和移动赋值运算符。
现在我在 VS2012 中测试这段代码,移动构造函数只被调用一次。我期待它被调用两次。如果有人可以向我解释这一点,我将不胜感激。我希望在中继调用第一个移动构造函数,在 mfoo 调用下一个移动构造函数
c++ - 了解这个完美的转发示例
std::forward
我在尝试了解以下示例时遇到了以下示例
程序的输出是
用右值调用 fn:[左值][右值]
现在我的问题是我们是如何获得lvalue
第一的?这是我在main
我称为fn(0);
Now 0 is rvalue 中的思路。因此,通用参考 x 被推导出为以下
现在根据参考折叠我们会得到
从而使x
行为像右值。因此,如果x
传递,则应调用右值重载方法。然而,似乎调用了另一个重载的左值引用函数。如果有人能澄清这一点,我将不胜感激
c++ - (C++11) 可变模板函数转发给另一个
我正在尝试将我的尾巴从 to 转发parser
,add_option
但 GCC 不允许这样做:
相反,GCC 给了我这个错误:
谁能告诉我我在这里做错了什么?我怎样才能解决这个问题?
c++ - STL算法的参考友好性
假设我们有一个函子,它包含几个不同的 ref 限定或简单的 const 限定重载operator ()
。我想为使用 STL 算法的不同上下文调用不同的算法。也就是说,我想根据operator ()
我提供给 STL 算法的仿函数值/引用的常量或“左值/右值”来正确重载要调用的函数。说,有假设算法recurrent_all_of
。我可能期望在 STL 中找到的形式是:
但是为了满足引用友好的要求,表格应该如下:
有什么误解吗?为什么 STL 算法不是这样设计的?