2013-03-15 177 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