3
boost::shared_array<char const *> x(new char const *[n]);

上記の行 (nは 100 以下の整数) でchar const**( ) を作成し、 が削除されたときに配列が削除されるようconst char**にスマート ポインターに配置しています。そして私にとって、これがどのように、そしてなぜ機能するのかは明らかです。xx

boost::shared_array<char const *> x = new char const *[n];

次に、2 行目を見てみましょう。ここでは、最初のケースとまったく同じことを行うと思います。はい、一見すると、ここでNULL(shared_array コンストラクター パラメーターのデフォルト値) を介して x を構築し、 を呼び出しているように見えるかもしれませんoperator=が、これは誤りです。operator=constructornew opeartor

しかし、これを吐き出して、私は得ていますerror C2440: 'initializing' : cannot convert from 'const char **' to 'boost::shared_array<T>

私が目にする唯一の問題は、 の明示的なコンストラクターですboost::shared_array<T>。しかし、私は何が問題なのかわかりませんか?明示的なコンストラクターがこのエラーを引き起こすのはなぜですか? 問題が明示的なコンストラクターにない場合、どこで、なぜですか?

4

3 に答える 3

3

あなたの推測は正しいです。

2 行目でやろうとしているのは、暗黙的にコンストラクターを呼び出すことです。C++ コンパイラーに、a を受け入れて使用するコンストラクターがあることを認識させますT*。ただし、コンストラクターはexplicitとしてマークされているため、この方法で呼び出すことはできません。

たとえば、http://www.go4expert.com/forums/showthread.php?t=20756での議論を参照してください。

于 2011-03-26T11:12:46.393 に答える
2

はい、「問題」は、のT*コンストラクターshared_arrayexplicit. での構築を禁止し=ます。

于 2011-03-26T11:10:05.500 に答える
1

次に、2 行目を見てみましょう。ここでは、最初のケースとまったく同じことを行うと思います。はい、一見すると、ここでは NULL (shared_array コンストラクター パラメーターのデフォルト値) を介して x を構築し、次に operator= を呼び出しているように見えるかもしれませんが、これは誤りです。新しいオペレーターによる。

それは完全に真実ではありません。一般的なケースで実際に何が起こるかを次に示します。あなたが持っていると仮定します

struct A
{
   /*explicit*/ A(int){}

};

A a = 7;

これは実際には と同等ではありませんA a(7)。初期化ではA a = 7、int を使用して一時オブジェクトを作成するコンストラクターと、初期化するコピー コンストラクターの 2 つのコンストラクターを呼び出しますa。もちろん、これはほとんどの場合冗長であり、コンパイラーはコピーコンストラクター呼び出し (標準で明示的に言及されています) を省略することができますが、呼び出しを省略するかどうかに関係なく、1 つ持つ必要があります。

struct A
{
   /*explicit*/ A(int){}
   private: A(A const &){}  
};

A a = 7;

これはコンパイル時エラーになります。両方のコンストラクターにいくつかのトレース メッセージを追加すると、コピー コンストラクターがとにかく呼び出されないことがわかるでしょうが、それは問題ではありません。

explicit上記の構文を呼び出すことを妨げる理由については、今すぐ明確にする必要があります。そのコンストラクターは、一時的なものではなく、一時的なものを初期化するために暗黙的に呼び出されるためaです。

HTHと乾杯、:)

于 2011-06-28T22:02:23.300 に答える