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 關注
- 472 瀏覽
添加回答
舉報