2012-03-20 67 views
3

有以下代碼:SomeClass的的使用一個參數匿名對象不能被聲明

class SomeClass 
{ 
public: 
    SomeClass(){} 

    SomeClass(SomeClass& b){} 

    SomeClass(SomeClass&b, SomeClass& c){} 
}; 

int main() 
{ 
    SomeClass a; 
    SomeClass(); // works all right 
    //SomeClass(a); error: redeclaration of ‘SomeClass a’ 
    SomeClass(a, a); // works all right 
    return 0; 
} 

匿名對象,具有0和2參數可以聲明,但是它不能與只有1參數進行聲明。我認爲寫

SomeClass(a); 

相同

SomeClass a; 

如何創建匿名對象有一個說法?

+0

@BoBTFish:不。他基本上是通過功能強化語法創建一個臨時對象。你不直接調用構造函數;甚至沒有你發佈的代碼實際上這樣做 – 2012-03-20 16:21:39

+0

可能重複[這個AnonymousClass(變量)聲明實際上發生了什麼?](http://stackoverflow.com/questions/6341951/whats-actually-going-on-in-這個匿名類變量聲明) – Nawaz 2012-03-20 16:31:58

回答

3

您可以在自己的聲明中構造一個臨時對象的東西,如:

(SomeClass)a; 

(SomeClass(a)); 

正如您所觀察到的,需要括號解決聲明和表達式聲明之間的不明確性。

0

你的假設是正確的。

在相同的語句可能是聲明的上下文中,您只能使用單個構造函數參數創建臨時對象。語法使其含糊不清(或者,如果您看到的行爲沒有被定義爲優先考慮,那麼將不明確)。

爲什麼不給這個對象一個名字呢?

SomeClass obj(a); 

或者,如果你有一個理由,希望對象被立即銷燬(有時這是有用的,例如boost::this_thread::interruption_point,但不帶任何參數),你仍然可以創建一個臨時的,但去ambiguate的聲明:

(SomeClass(a)); // the parens prevent this from being a declarative statement 

在某些情況下,您可能還可以使用C風格的轉換:

(SomeClass)a; 

但是,希望你SomeClass CON結構實際上標記爲explicit,我們寧願不使用C風格的演員。

在其他情況下,那些在臨時可能使反正更有意義,就不會出現這個問題:

std::cout << SomeClass(a); // *can't* be a decl of a `SomeClass` called `a` 
+2

「爲什麼不改變對象被破壞的時候呢?」 ; -p – 2012-03-20 16:22:29

+0

@SteveJessop:Pfft:P. – 2012-03-20 16:25:13

2

您可以創建anonymouse對象爲以下幾點:

(SomeClass(a)); 

這解決了歧義之處,因爲它不能是a的聲明。

(SomeClass a); // Error: this can't be a declaration because of the parentheses 
       //  but what else should it be? 
1

通常,通過編寫與您想要編寫的效果相同的效果來避免最令人頭疼的解析,但不能將其解析爲聲明。

通常,這是通過添加括號來完成的。

在這種情況下(SomeClass(a));都行,或(void) SomeClass(a);

2

在這方面,該括號是多餘的,這意味着

SomeClass(a); //declaration of a 

是完全等同於

SomeClass a; //declaration of a 

這又是等效到這些:

SomeClass((a)));  //declaration of a 
SomeClass(((a)));  //declaration of a 
SomeClass((((a)))); //declaration of a 
SomeClass(((((a))))); //declaration of a 

所有這些聲明變量名稱a和類型SomeClass