3

以下代码在使用 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__

4

1 回答 1

4

编译器中似乎有两个错误。首先它错误地调用push_back(T&&)which 然后尝试移动对象,这是错误地实现的:

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

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

于 2013-01-17T07:00:48.080 回答