0

Variable次のように定義されている char* 用の特殊なコンストラクターを持つ、 というテンプレート クラスがあります。

template<>
Variable<char*>::Variable(char * const &arg_value)
{
    value = new char[strlen(arg_value) + 1];
    strncpy(value, arg_value, strlen(arg_value));
    value[strlen(arg_value)] = '\0';
}

今、私は次のステートメントを宣言していVariable<char*>ます:

Variable<char*> stringVar = const_cast<char*>("Hi");

私のVariable定義では、const char* へのコピー コンストラクターを宣言または定義したことはありません。ただし、ステートメントは完全に正常に機能します。どうしてこれなの?stringVarのデータ型を持つことは非常に肯定的ですがVariable<char*>、これはまだ機能します。この任務はどこから来たのですか?

4

4 に答える 4

4

引数を 1 つ取るコンストラクターでは、暗黙的な変換が可能です。状況の簡単な例を次に示します。

struct Foo { Foo(int, double = 0.5, char = 'a') { } };

void bar(Foo);

Foo x = 1; // OK!
bar(2);    // also OK

この暗黙の変換を禁止するには、次のように言いますexplicit

struct Eew { explicit Eew(int) { } };

// Eew e = 3;    // error
Eew e2 = Eew(3); // OK but weird
Eew e3(3);       // correct
于 2012-08-31T18:00:51.557 に答える
2
Variable<char*> stringVar = const_cast<char*>("Hi");

class の暗黙の c-tor を呼び出しますVariable<char*>。に等しい

Variable<char*> stringVar = Variable<char*>(const_cast<char*>("Hi"));
于 2012-08-31T17:56:33.480 に答える
1
char hi[] = "Hi";
Variable<char*> stringVar = hi;

上記の 2 行目は、意味的には次のものと同等です。

Variable<char*> stringVar( implicit_cast<Variable<char*>>(hi) );

implicit_cast利用可能な暗黙的な変換がある場合にのみ、宛先の型への型変換を実行するようなものがあったと仮定します。あなたの場合、コンストラクター:

Variable<T>::Variable( T const & )

は暗黙的な変換を提供します。 からへのVariable<char*>::Variable( char * const & )変換に使用できます。char*Variable<char*>

意味的にはこのようになりますが、実際にはコピーは省略され、コードは同等のものにコンパイルされることに注意してください。

Variable<char*> stringVar(hi);

つまり、すべてのチェックが実行された後: からhi型への暗黙的な変換が可能になり、コピー コンストラクターを暗黙的に呼び出すことができます。

于 2012-08-31T18:03:32.117 に答える
1

デフォルトのコピー コンストラクターを呼び出しています。Variable<> テンプレートに非表示のものを宣言し、コンパイル ブレークを監視します。

于 2012-08-31T17:56:38.550 に答える