2012-08-31 91 views
0

我有一個叫Variable模板類,與字符*,它被定義爲一個專門的構造函數如下:模板的數據類型

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*>,但這仍然有效。這項任務來自哪裏?

+2

聲明中的等號不是賦值。 – chris

+0

它是拷貝構造函數嗎? – ZERO

+2

'變量'不是模板類。這是一個*類模板*。 –

回答

4

採用一個參數的構造函數允許隱式轉換。這裏是您的情況簡單的例子:

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 
2
Variable<char*> stringVar = const_cast<char*>("Hi"); 

調用類Variable<char*>的隱式c-tor。 這等於

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

哦,所以當分配data-type1到data-type2時,C++將在data-type1的構造函數中查看它們中的任何一個是否接受char * const作爲參數?這是所有數據類型? – ZERO

+0

@ZERO它不分配。這是初始化。 – ForEveR

1

您正在調用默認的複製構造函數。聲明一個隱藏在變量<>模板中的變量並觀察編譯中斷。

+0

複製構造函數僅用於複製同一個類嗎? – ZERO

+0

是的,但是您正在經歷右側的所謂隱式構造。跟蹤調試器,你會發現你構建了兩個對象;不是一個。自從我進入隱含結構的時候,它已經很長時間了,而不是。然而在你的情況下,我相信賦值的rhs隱含地構造了一個變量,因爲定義的構造函數可以實現數據類型,然後在構造時觸發默認的複製構造函數將其轉儲到lhs中。 – WhozCraig

1
char hi[] = "Hi"; 
Variable<char*> stringVar = hi; 

上面的第二行是語義相當於:

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到該類型可用,並且可以隱式調用複製構造函數。