Chinaunix首页 | 论坛 | 博客
  • 博客访问: 825734
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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的匿名对象。因为没有函数名的函数声明是没有任何存在意义的。

阅读(1409) | 评论(10) | 转发(0) |
0

上一篇:一个简单Tree类

下一篇:发现VS2005的一个bug

给主人留下些什么吧!~~

网友评论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:14

ralph623
关于那个 vector 的问题,好像 effective stl 里面提到过,说这是c++语言的“阴暗面”,唯一的办法就是熟悉它

网友评论2012-11-20 11:17:05

xyz
       具体的我也不是很清楚,这是从书上搬过来的,不过你肯定能看明白。
    在声明和表达式语句这两者的语法形式之间可能会出现二义性:
一个将函数风格的显式转换作为其最左端的子表达式语句和一个其第一个声明子以“(”开头的声明语句可能会无法分开。在这种情况下,该语句被解释为声明。

    我认为根本的不在于foo,而在于bar obj( foo(i), foo() );这一句。编译器认为它更象是一个函数声明,所以它特意将foo()曲解成函数类型以便将整个语句解释为一个函数声明。
     
    typedef foo(Func)(void);
      bar obj( foo i, Func );

而第二个foo()则不能被解释为函

网友评论2012-11-20 11:16:57

周星星
谢谢,既然“一段代码如果可以被解释成声明,那它就是声明”,那么为什么②中的 foo() 不像①中的 foo() 一样被解释为声明?

网友评论2012-11-20 11:16:47

bennie
这是C++为了保证兼容性而继承的C的声明语法,就是一段代码如果可以被解释成声明,那它就是声明。
来自《Exceptional C++ Style》的29。