2016-08-04 10 views
10

我々は、このような状況を持っていたし、これは残念ながらTの動きコンストラクタが保護されている、と我々は唯一*thisのコンストラクタの初期化リストでそれを呼び出すことが許可されているので、コンパイルに失敗し保護されたベースコンストラクタの実行がnoexceptである場合はどうすればいいのですか?

template<typename T> 
struct A : T { 
    A(T &&t) noexcept(noexcept(T(std::move(t)))) 
    :T(std::move(t)) 
    { } 
}; 

にそれを修正するための最良の方法について疑問に思いました。この作業を行うための回避策はありますか、それとも標準的な方法ですか?

+0

「と我々は唯一 '* this'のコンストラクタの初期化リストでそれを呼び出すことが許可されている」 - 何を、待つのか?これは保護された*コンストラクタの特別なルールですか?あなたは初期化リストでそれらを使用できるだけですか? –

+0

どのコンパイラがコンパイルに失敗しましたか? – ecatmur

+1

@ecatmur Intel/GCCは失敗します(おそらくClangも)。すべての保護された関数と同様に、 '* this'の型のオブジェクトまたは派生クラスを介した呼び出しだけが許可されます。 –

答えて

1

あなたがnoexcept(std::is_nothrow_move_constructible<T>::value)を探しています: http://en.cppreference.com/w/cpp/types/is_move_constructible

+4

移動コンストラクタが保護されており、その特性にアクセスできないため、これは機能していません。 –

+0

@ JohannesSchaub-litbあなたは基本クラスの友達として追加する必要があるようです。 –

関連する問題