2012-05-11 22 views
3

私はC++ 0x仕様のC++コンパイラを使用しており、std :: wstringをラップするStringクラス用の移動コンストラクタを作成したいと考えています。std :: move()の代わりに何が使えますか?

class String { 
public: 
    String(String&& str) : mData(std::move(str.mData)) { 
    } 

private: 
    std::wstring mData; 
}; 

Visual Studioでは、これは完全に機能します。 Xcodeでは、std::move()は利用できません。

+0

'std :: move'ではなくrvalue参照をサポートするコンパイラは何ですか? – Praetorian

+1

@Prætorian:Apple LLVMコンパイラ3.0 –

+4

C++ 0x = C++ 11。 'std :: move'をサポートしていないコンパイラを意味するなら、* that *を書いて、存在しない区別を発明しないでください。 –

答えて

4

std::moveは、引数をrvalue参照にキャストします。

template<class T> 
typename std::remove_reference<T>::type&& 
move(T&& arg) noexcept 
{ 
    return static_cast<typename std::remove_reference<T>::type&&>(arg); 
} 
+1

'remove_reference'が定義されていません。私はしかし、それがSTLで行われた方法を見ました - チップのおかげで! –

+4

@ PhoenixX_2 std :: moveとstd :: remove_referenceは標準ライブラリの一部です。コンパイラはすでに値の参照を知っているので、独自の 'move()'を実装するのではなく、単にC++ 11の標準ライブラリを使うべきです。私はあなたがlibstdC++を使用していたと推測しています。あなたはlibC++への切り替えに目を通すべきです。 – bames53

+0

@ bames53:私はXcodeに慣れていないし、私が見る唯一のオプションは、私が試したことだ。私自身の動きを包み込むことは完璧に働いた。 –

関連する問題