为什么GCC在调用成员函数之前需要括号括起来?

时间:2014-08-15 10:23:36

标签: c++ gcc

我有一个函数,它可以使用任意数量的指向自定义类的指针,这些指针在很大程度上是使用new进行实例化的。

示例:

addListItems(
    new Item(1, 2, 3),
    NULL);

这很有效。但是,只要我在Item上调用init函数,就像这样:

addListItems(
    new Item(1, 2, 3)->initMoreStuff(4, 5, 6),
    NULL);

我的编译器抛出了错误:'expect')'之前' - >'令牌。 我一做到:

addListItems(
    (new Item(1, 2, 3))->initMoreStuff(4, 5, 6),
    NULL);

它停止抱怨。我已经尝试过与BCB 6完全相同的代码而没有任何问题,那么为什么GCC会抱怨这个呢?

如果我使用制造商功能或将结果放在' new'在将变量添加到函数之前变为变量,它也可以工作。

new的电话放入括号会产生任何可能的副作用吗?

2 个答案:

答案 0 :(得分:3)

-> has higher precedence than new,因此您的原始版本被解析为

new (Item(1, 2, 3)->initMoreStuff(4, 5, 6))

在语法上无效。看起来BCB 6错了。

答案 1 :(得分:3)

它归结为解析。您需要括号表示->适用于 new-expression 的结果,而不是临时构造Item(1, 2, 3)。这是因为-> has higher precedence than new

除了上下文语法问题外,new Item(1, 2, 3)(new Item(1, 2, 3))之间绝对没有语义差异。

最后,如果" BCB6"接受你的原始代码然后它是错误的(并且非常引人注目)。