3 回答
TA贡献1831条经验 获得超9个赞
简介<initializer_list>在18.9中,可以相当清楚地表明,初始化程序列表的元素总是通过Const-引用传递的。不幸的是,在当前语言的修订版中,在初始化程序列表元素中似乎没有任何使用移动语义的方法。
具体而言,我们有:
typedef const E& reference;
typedef const E& const_reference;
typedef const E* iterator;
typedef const E* const_iterator;
const E* begin() const noexcept; // first element
const E* end() const noexcept; // one past the last element
TA贡献1785条经验 获得超8个赞
#include <iterator>#include <vector>#include <memory>int main(){ using move_only = std::unique_ptr<int>; move_only init[] = { move_only(), move_only(), move_only() }; std::vector<move_only> v{std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init))};}
std::make_move_iterator
原文:
#include <utility>#include <type_traits>template<class T>struct rref_wrapper{ // CAUTION - very volatile, use with care explicit rref_wrapper(T&& v) : _val(std::move(v)) {} explicit operator T() const{ return T{ std::move(_val) }; }private: T&& _val;};// only usable on temporariestemplate<class T>typename std::enable_if< !std::is_lvalue_reference<T>::value, rref_wrapper<T>>::type rref(T&& v){ return rref_wrapper<T>(std::move(v));}// lvalue reference can go awaytemplate<class T>void rref(T&) = delete;
std::vector<move_only> v{ rref(move_only()), rref(move_only()), rref(move_only()) };
// in class initializer_listtemplate<class U>initializer_list(initializer_list<U> const& other);
initializer_list<rref_wrapper<move_only>>
{...}
initializer_list<move_only>
vector<move_only>
std::initializer_list<rref_wrapper<move_only>> il{ rref(move_only()), rref(move_only()), rref(move_only()) };std::vector<move_only> v(il.begin(), il.end());
TA贡献1906条经验 获得超10个赞
std::initializer_list
#include <vector>#include <memory>struct Foo{ std::unique_ptr<int> u; int x; Foo(int x = 0): x(x) {}};template<typename V> // recursion-ender void multi_emplace(std::vector<V> &vec) {}template<typename V, typename T1, typename... Types>void multi_emplace(std::vector<V> &vec, T1&& t1, Types&&... args){ vec.emplace_back( std::move(t1) ); multi_emplace(vec, args...);}int main(){ std::vector<Foo> foos; multi_emplace(foos, 1, 2, 3, 4, 5); multi_emplace(foos, Foo{}, Foo{});}
multi_emplace(foos, {});
{}
vector::resize
)
- 3 回答
- 0 关注
- 435 浏览
添加回答
举报