C ++ 11 Android-вектор указателей push_back не работает с переполнением libstdStack

Следующий код прекрасно компилируется при использовании STLPort:

std::vector<Engine::Screen::IOverlay*> Overlays;
auto TestOverlay=new Engine::Screen::Overlay();
Overlays.push_back(TestOverlay);

Однако при компиляции с libstdc ++ он пытается использовать конструктор перемещения по некоторым причинам:

error : cannot bind 'Engine::Screen::IOverlay*' lvalue to 'Engine::Screen::IOverlay*&&' ...\android-ndk-r8\sources\cxx-stl\gnu-libstdc++\include\bits\move.h

Это очень простой пример, но эта проблема возникает в приложении для всех локальных указателей при использовании push_back.

Ошибка в файле move.h:

template<typename _Tp>
inline typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t)
{ return __t; }

Пример 2 (Еще один базовый тест, который я написал 🙂

class TestClass {};
auto TestInstance=new TestClass;
std::vector<TestClass*> TestVector;
TestVector.push_back(TestInstance);

Я скомпилировал с ndk r8: -std = c ++ 11 -D__STDC_INT64__

3

Решение

Кажется, в компиляторе есть две ошибки. Сначала это неправильно вызываетpush_back(T&&) который затем пытается переместить объект, что неправильно реализовано:

template<typename _Tp>
inline typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t)
{ return __t; }

Это должно быть реализовано как:

template<class _Tp>
typename remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept //noexcept should be here!
{
return static_cast<typename remove_reference<_Tp>::type&&>(__t);
}

Это означает, что ваш компилятор показывает две ошибки в этом контексте:

  • неверное разрешение перегрузки, как это называется push_back(T&&),
  • неправильная реализация std::move

какую версию какого компилятора вы используете?

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]