【发布时间】:2013-08-02 10:17:58
【问题描述】:
最少的代码:
struct A {
A(int = 0) {}
};
int i = 0, *p = &i;
int* foo () { return p; }
int main () {
A(); // calls `A::A(int=0)`
A(i); // calls `A::A(int=0)`
A(*p); // <--- (1) same as local `A *p;`
{
A((*p)); // <--- (2) same as local `A *p;`
}
A (*foo()); // <--- (3) ??
{
A ((*foo())); // <--- (4) ??
}
}
预计至少 A((*p)) 会调用 A::A(int=0)。即使在*p 周围加上多个大括号,也会将该语句视为A *p;。foo 相关语句也是如此,其中构造函数 A::A(int=0) 未被调用。
这是demo。
问题:
- 为什么甚至 (2) 和 (4) 都被视为声明?
- 语句(3)和(4)中
foo的描述是什么?
【问题讨论】:
-
顺便说一句,你知道
A(i);和A i;是一样的,对吧? -
为什么(1)不创建带有*p的临时A对象传递给构造函数?
-
声明中的括号会影响“解析方向”。这很有用的示例 - 将格式错误的
int& a[5];与很好的int (&a)[5];进行比较。现在A(*p)中的括号是多余的,因为A*p的解析方式相同。因此,这是一个有效的声明。 -
如何使用 *p 作为构造函数参数创建 A 类型的未命名临时对象?
-
(0, (A(*p));,例如。
标签: c++ pointers language-lawyer dereference most-vexing-parse