讓我用一個簡單的例子證明:拷貝/轉換構造函數的定義(常量/非const)
class A
{
public:
A() { cout << "A::A()" << endl; }
A(A const& a) : _a(a._a) { cout << "A::(A Copy Const)" << endl; }
A(A& a) : _a(a._a) { cout << "A::(A Copy)" << endl; }
template <typename _T1>
A(_T1& v1) : _a(v1) { cout << "A::(T conversion)" << endl; }
~A() { cout << "A::~A()" << endl; }
void say() { cout << "A::say()" << endl; }
private:
int _a;
};
int main(int argc, char* argv[])
{
A a1(A(argc)); // Line 1: ERM?
a1.say();
return 0;
}
幾件事情:
是否有界定一個const和非const任何傷害複製構造函數的版本?原因我做這個的是,這顯然有助於編譯器從模板構造函數區分,即
A const a1(argc);
A a2(a1); // <-- correctly call the const copy ctor
A a3(argc);
A a4(a3); // <-- correctly call the non-const copy ctor
是否有更好的方法,以確保在上面的例子中,拷貝構造函數總是被調用在模板構造函數?其次,從純粹的編碼角度看,第1行似乎沒問題,目的是創建一個臨時的A
與argc
,然後觸發複製構造函數,但是我得到以下異常(gcc 4.4.4):
錯誤:請求成員「說」的「A1」,這是無級類,A(A)「
我相信這裏發生了什麼是編譯器認爲a1
是函數定義,這是正確的嗎?如果是這樣,那麼編寫該特定行代碼的正確方法是什麼?以下似乎是一個黑客!
A a1(true ? A(argc) : A());
p.s.請忽略所有的文體foobar,爲什麼我要這樣做......! :)
汽車似乎不能在C++ 98中工作,但圓括號確實有效!謝謝。 – Nim 2010-11-09 18:06:35