4

オブジェクトのインプレース構築を行うために、いくつかの引数を転送しようとしています。連想コンテナでのemplaceの使用の背後にある論理的根拠を完全に理解していないか、間違った方法で使用/考えているだけかもしれません。誰かが使用するためのコードスニペットを共有できれば素晴らしいと思います。

mapのような連想コンテナは常に種類pair()のオブジェクトを格納し、emplace関数は、引数を転送することによって、格納されているオブジェクトのコンストラクター(マップの場合は常にペア)を呼び出すことを示します。では、関数に可変個引数のシグネチャがある場合でも、2つの引数(key、value)を提供するように制限されているだけですか?

次のような引数を渡す前に、ブーストコンテナでemplaceを使用した場合:emplace(arg1、arg2、arg3、arg4)//ここで、arg2、arg3、arg4はオブジェクトの構築に使用され、arg1がキーでした。

新しいgcc-4.6とc++11でコンパイルすると、これは壊れますが、今は次のようなことをしなければなりません:emplace(arg1、myobj(arg2、arg3、arg4)); //同じコードを機能させる;

それで、新しい場所はブーストのような区分的構造をしませんか?また、ペアはコンストラクターに対して常に2つの引数を受け入れるため、マップに提供する引数は2つだけに制限されていますか。

4

2 に答える 2

7

これは確かに規格の欠陥であり、N3178で詳細に対処されています。

引用するには、

value_typeのオブジェクトを作成する唯一の方法は、KeyとValueの2つの引数、ペア、またはpiecewise_construct_tの後に2つのタプルを指定することです。元のemplace()提案では、Key値の後に、Valueのコンストラクター引数をいくつでも指定できました。ペアにする可変個引数コンストラクターを削除すると、この機能はなくなりました

..。

オブジェクトを構築する場合、現状では、piecewise_construct_tを使用します。

「NAD」として閉鎖されまし

于 2012-12-03T19:49:57.680 に答える
7

それで、新しい場所はブーストのような区分的構造をしませんか?

「区分的構造」と呼ばれるものは、標準で区分的構造と呼ばれるものではありません。つまり、次のようになります。

m.emplace(std::piecewise_construct,
          std::forward_as_tuple<A1>(arg1),
          std::forward_as_tuple<A2,A3,A4>(arg2, arg3, arg4));

これはまさにあなたが望むことを行い、引数のタプルを最初と2番目pairのメンバーに転送します(ただし、GCC 4.6では、引数の種類ごとにアクセス可能なコピーコンストラクターが必要であることに注意してください。http: //gcc.gnu.org/bugzilla/を参照してください。 show_bug.cgi?id = 51183-この要件は、GCC 4.6ではサポートされていない委任コンストラクターを使用することにより、 GCC4.7で修正されています。

于 2012-12-04T01:27:48.520 に答える