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 关注
 - 488 浏览
 
添加回答
举报
