我目前与以下语句混淆 - 我虽然这个语句会在编译时产生错误,但它不会。指针的初始化
// statement 1:
someclass* q(someclass());
我明白,如果声明是这样
// statement 2:
someclass* q(&someclass());
我想知道为什么statment 1次犯规产生错误或者即使是有效的(有什么我缺少的幕后?)
我目前与以下语句混淆 - 我虽然这个语句会在编译时产生错误,但它不会。指针的初始化
// statement 1:
someclass* q(someclass());
我明白,如果声明是这样
// statement 2:
someclass* q(&someclass());
我想知道为什么statment 1次犯规产生错误或者即使是有效的(有什么我缺少的幕后?)
我想知道为什么statment 1次犯规产生错误或者即使是有效
第一条语句是有效的,虽然它可能不是做你所期望的:这种说法是声明一个功能名为q
它返回一个指向someclass
类型的对象和在输入有这反过来接受任何参数和返回someclass
类型的对象的函数。这被称为Most Vexing Parse。
第二条语句是无效的:它正试图声明名为q
到someclass
类型的对象的指针,并且该指针初始化到由someclass()
表达构造的对象的地址。但是请注意,这someclass()
是临时,并采取临时的地址是非法的。
因此,我建议使用'='运算符而不是'()'来初始化。例如'someclass * q = someclass();'会像你期望的那样产生一个错误。 – Lorkenpeist 2013-03-15 23:06:13
第二条语句无效。你*不能*取临时地址。 – 2013-03-15 23:09:47
@BenjaminLindley:该死的,我怎么能忽略这一点。谢谢 – 2013-03-15 23:11:56
语句1实际上是一个函数的声明。该函数被称为q
,并且指向一个不带参数的函数并返回someclass
,并返回指向someclass
的指针。
您是否尝试在第一个示例中使用“指针”? – molbdnilo 2013-03-15 22:59:26