3

STLPortを使用すると、次のコードが正常にコンパイルされます。

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

ただし、libstdc ++でコンパイルする場合、何らかの理由でmoveコンストラクターを使用しようとしています。

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

コンパイラには2つのバグがあるようです。最初に誤って呼び出し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);
}

これは、コンパイラがこのコンテキストで2つのバグを示していることを意味します。

  • を呼び出すため、過負荷の解決が正しくありませんpush_back(T&&)
  • の誤った実装std::move

どのコンパイラのどのバージョンを使用していますか?

于 2013-01-17T07:00:48.080 に答える