使用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__
答案 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
您使用的是哪个版本的编译器?