2013-03-15 178 views
5

我目前與以下語句混淆 - 我雖然這個語句會在編譯時產生錯誤,但它不會。指針的初始化

// statement 1: 
someclass* q(someclass()); 

我明白,如果聲明是這樣

// statement 2: 
someclass* q(&someclass()); 

我想知道爲什麼statment 1次犯規產生錯誤或者即使是有效的(有什麼我缺少的幕後?)

+0

您是否嘗試在第一個示例中使用「指針」? – molbdnilo 2013-03-15 22:59:26

回答

12

我想知道爲什麼statment 1次犯規產生錯誤或者即使是有效

第一條語句是有效的,雖然它可能不是做你所期望的:這種說法是聲明一個功能名爲q它返回一個指向someclass類型的對象和在輸入有這反過來接受任何參數和返回someclass類型的對象的函數。這被稱爲Most Vexing Parse

第二條語句是無效的:它正試圖聲明名爲qsomeclass類型的對象的指針,並且該指針初始化到由someclass()表達構造的對象的地址。但是請注意,這someclass()臨時,並採取臨時的地址是非法的。

+2

因此,我建議使用'='運算符而不是'()'來初始化。例如'someclass * q = someclass();'會像你期望的那樣產生一個錯誤。 – Lorkenpeist 2013-03-15 23:06:13

+2

第二條語句無效。你*不能*取臨時地址。 – 2013-03-15 23:09:47

+0

@BenjaminLindley:該死的,我怎麼能忽略這一點。謝謝 – 2013-03-15 23:11:56

3

語句1實際上是一個函數的聲明。該函數被稱爲q,並且指向一個不帶參數的函數並返回someclass,並返回指向someclass的指針。

請參閱Most Vexing Parse