2

わかりました、これは私のコンパイラ(vs2008)で動作しますが、私は非標準的なことをしているのかどうかを理解しようとしています。これが私がしている簡単な例です:

std::tr1::array<int, 3> OneTwoThree() {
    return boost::assign::list_of(1)(2)(3).to_array(std::tr1::array<int, 3>());
}

to_arrayアダプターは、渡された引数を実際には使用せず、型を把握するために使用しているだけであるという事実をだましています。ただし、例は、次のように使用されていることを示しています。

std::tr1::array<int, 3> a = boost::assign::list_of(1)(2)(3).to_array(a);

値で初期化された配列をto_arrayにスローするだけで、それがコーシャであるかどうかについてのアイデアはありますか?これを行うためのよりクリーンな方法はありますか?

4

1 に答える 1

3

to_...メンバー関数はすべて、テンプレート引数の推定を支援する目的でのみ引数を取ります。したがって、はい、戻り型と同じ型の値で初期化された†インスタンスを渡すことは安全ですが、不必要に非効率的です

ただし、to_...メンバー関数は、テンプレート化された変換演算子を適切にサポートしていない壊れたコンパイラを支援するためにのみ存在します-そもそもなぜそれらを使用しているのですか?クリーンな構文は次のようになります。

boost::array<int, 3> OneTwoThree() {
    return boost::assign::list_of(1)(2)(3);
}

ここでは;boost::array<>ではなく使用していることに注意してください。std::tr1::array<>その理由は、Boost.AssignライブラリにはTR1 / C ++ 11標準ライブラリに関する知識が(まだ)ないため、std::array<>またはに適切に特化されていないためstd::tr1::array<>です。この特殊化を自分で追加し、その結果、上記のコードをで機能させるには、Boost.Assignヘッダーを含めたstd::tr1::array<>に次のコードを追加します。

namespace boost { namespace assign_detail {

template<typename T, std::size_t sz>
type_traits::yes_type assign_is_array(std::tr1::array<T, sz> const*);

}}

(注:Boost 1.48でのみテストされています。以前のバージョンでは、別の特殊化が必要になる場合があります。)


質問の構文はデフォルトの構築ではなく、値の初期化です。

于 2011-11-28T21:46:42.420 に答える