C ++ 11指针push_back的Android向量不能与libstdc ++一起使用

时间:2013-01-17 06:39:46

标签: c++ c++11 android-ndk libstdc++

使用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__

1 个答案:

答案 0 :(得分:4)

编译器似乎有两个错误。首先,它错误地调用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
  • 的错误实施

您使用的是哪个版本的编译器?