Questions tagged «perfect-forwarding»

4
T &&(双“&”号)在C ++ 11中是什么意思?
我一直在研究C ++ 11的一些新功能,而我注意到的一个是在声明变量(如)时使用了双“&”号T&& var。 首先,这只野兽叫什么?我希望Google允许我们搜索这样的标点符号。 这到底是什么意思? 乍一看,它似乎是一个双重引用(如C样式的双指针T** var),但是我很难考虑到这种情况的用例。

6
使用std :: forward的主要目的是什么,它可以解决哪些问题?
在完善的转发,std::forward是用来转换指定的右值引用t1,并t2以不具名rvalue引用。这样做的目的是什么?inner如果我们将t1&保留t2为左值,对调用的函数有何影响? template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

6
make_unique和完美的转发
为什么std::make_unique标准C ++ 11库中没有功能模板?我发现 std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3)); 有点冗长。以下内容会更好吗? auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3); 这new很好地隐藏了,只提及了一次类型。 无论如何,这是我尝试实现的make_unique: template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } 我花了很std::forward长时间才可以编译这些东西,但是我不确定它是否正确。是吗?到底是什么std::forward<Args>(args)...意思?编译器如何处理?


1
如何对可变参数函数中的所有参数调用std :: forward?
我只是在编写一个通用对象工厂,并使用boost预处理器元库制作一个可变参数模板(使用2010,但它不支持它们)。我的函数使用rval引用并std::forward进行完美的转发,这让我开始想...当C ++ 0X出现并且我有一个标准的编译器时,我将使用真实的可变参数模板进行此操作。不过,我std::forward该如何谈谈? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } 我能想到的唯一方法是需要手动解压缩... params,而且我也还没有。有没有一种更快的语法可以工作?

1
我可以通过元素的完美转发来列表初始化std :: vector吗?
我注意到std :: vector的聚合 列表初始化在以下情况下执行复制初始化移动更适用。同时,多个emplace_backs可以满足我的需求。 我只能提出编写模板函数的不完善解决方案init_emplace_vector。但是,它仅对非显式单值构造函数最佳。 template <typename T, typename... Args> std::vector<T> init_emplace_vector(Args&&... args) { std::vector<T> vec; vec.reserve(sizeof...(Args)); // by suggestion from user: eerorika (vec.emplace_back(std::forward<Args>(args)), ...); // C++17 return vec; } 题 我真的需要使用emplace_back来尽可能高效地初始化std :: vector吗? // an integer passed to large is actually the size of the resource std::vector<large> v_init { …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.