Войти
ФлеймФорумПрограммирование

[MSVC++] В std::array забыли добавить "operator=" с move-семантикой?

Страницы: 1 2 Следующая »
#0
15:23, 26 окт. 2016

Всем привет.

Код:

#include <iostream>
#include <array>
using namespace std;
struct Foo{void operator=(Foo&&ref){cout<<"done!\n";}};
int main() {
  std::array<Foo,2> a,b;
  a=std::move(b);
  cout<<"end\n";
  return 0;
}
Вывод:
end
Вот в g++ работает: http://ideone.com/72WL29

PS: MSVС++2010 и MSVС++2012.


#1
15:28, 26 окт. 2016

> 2010
Не мудрено. Посмотри в хедеры же.)

#2
15:44, 26 окт. 2016

typedef
> Не мудрено. Посмотри в хедеры же.)

cat array|grep -A 5 "&&"
  void swap(_Myt&& _Other)
    {  // swap contents with _Other
    _Move(_Other.begin(), _Other.end(), begin());
    }

  iterator begin()
--
    array<_Ty,_Size>&& _Right)
  {  // swap arrays
  typedef array<_Ty, _Size> _Myt;
  _Left.swap(_STD forward<_Myt>(_Right));
  }

--
  void swap(array<_Ty,_Size>&& _Left,
    array<_Ty,_Size>& _Right)
  {  // swap arrays
  typedef array<_Ty, _Size> _Myt;
  _Right.swap(_STD forward<_Myt>(_Left));
  }
--
  static_assert(0 <= _Idx && _Idx < _Size, "array index out of bounds");
  return (_Arr[_Idx]);
  }

template<int _Idx,
  class _Ty,
--
  static_assert(0 <= _Idx && _Idx < _Size, "array index out of bounds");
  return (_Arr[_Idx]);
  }
 #endif /* _HAS_TR1 */
  }  // namespace tr1
вот же говно.

А как там в новых версия студии?

#3
15:51, 26 окт. 2016

В 2015 работает

#4
21:07, 26 окт. 2016

Adler
> PS: MSVС++2010 и MSVС++2012.
Вы там мазохисты все что ли?

#5
21:31, 26 окт. 2016

Как в 2015 под хрюшу компилить, не-мазохисты?

#6
21:57, 26 окт. 2016

TarasB
Зачем? Пользователи хрюшки - неплатежеспособная и неблагодарная аудитория.

#7
22:10, 26 окт. 2016

TarasB
v140_xp

#8
22:21, 26 окт. 2016

Adler
swap юзай

#9
22:30, 26 окт. 2016

laMer007

#include <iostream>
#include <array>
using namespace std;
struct Foo{Foo&operator=(Foo&&ref){cout<<"done!\n";return *this;}};
int main() {
  std::array<Foo,2> a,b;
  std::swap(a,b);
  cout<<"end\n";
  return 0;
}
end

тоже не работет :(
#10
22:34, 26 окт. 2016

Adler
> std::swap
Так низя.

using std::swap;
swap(a,b);
#11
22:35, 26 окт. 2016

Adler
Попробуй своему Foo свой swap определить

#12
22:51, 26 окт. 2016

laMer007
вообще вот так работает:

#include <iostream>
#include <array>
using namespace std;
struct Foo{Foo&operator=(Foo&&ref){cout<<"done!\n";return *this;}};
int main() {
  std::array<Foo,2> a,b;
  a.swap(b);
  cout<<"end\n";
  return 0;
}
но такое решение не годится, т.к получается 2х вызовов "operator=".
#13
23:26, 26 окт. 2016

Adler
> т.к получается 2х вызовов "operator=".
Не понял что ты сказать то хотел? У тебя для класса фуу свап так и не определен.

#14
23:29, 26 окт. 2016

Adler
Изображение
Почему у тебя оператор перемещения кидает исключения?
Я бы на месте компилятора тебя бы тоже послал. operator=(Foo&&ref) как noexcept объяви и лови в нем исключения от стрима все.

А вообще какой-то мазохизм юзать 2010 в 2017

+ Показать

Страницы: 1 2 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.