2012年(158)
分类: C/C++
2012-11-20 11:14:26
#include
using namespace std;
struct foo
{
foo()
{
cout << "call
constructor" << endl;
}
foo( int i )
{
}
};
struct bar
{
bar( foo a, foo b )
{
}
};
int main( void )
{
int i = 0;
bar obj( foo(i), foo()
); // ---①
foo(); // ---②
}
①中,obj 不是
bar 的一个实例,而是一个函数申明,等同于 bar obj( foo i, foo (*)(void) )
也就是 foo(i) 等同于 foo i;
foo() 等同于 foo (*)(void)
②中,foo()不等于foo
(*)(void),而是定义了一个foo的匿名对象。因为没有函数名的函数声明是没有任何存在意义的。
网友评论2012-11-20 11:17:23
Yo
Sorry, I think this problem again, and I think I had a mistake yesterday. Now
First complier will compile the:
bar obj( foo(i), foo() );
to:
bar obj( foo i, foo() );
So in this case, it is a function declare.
But if you write:
bar obj( (foo(i)), foo() );
the compiler will parse it to:
bar obj(i, anonymous);
网友评论2012-11-20 11:17:05
xyz
具体的我也不是很清楚,这是从书上搬过来的,不过你肯定能看明白。
在声明和表达式语句这两者的语法形式之间可能会出现二义性:
一个将函数风格的显式转换作为其最左端的子表达式语句和一个其第一个声明子以“(”开头的声明语句可能会无法分开。在这种情况下,该语句被解释为声明。
我认为根本的不在于foo,而在于bar obj( foo(i), foo() );这一句。编译器认为它更象是一个函数声明,所以它特意将foo()曲解成函数类型以便将整个语句解释为一个函数声明。
typedef foo(Func)(void);
bar obj( foo i, Func );
而第二个foo()则不能被解释为函