Chinaunix首页 | 论坛 | 博客
  • 博客访问: 990972
  • 博文数量: 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的匿名对象。因为没有函数名的函数声明是没有任何存在意义的。

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

上一篇:一个简单Tree类

下一篇:发现VS2005的一个bug

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

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

周星星
谢谢,谢谢,我一直使用2,看来1和5也不错,3和4不合俺胃口。

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

anonymous
5, bar obj( ((foo)foo(i)),foo());

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

anonymous
1, 加auto修饰
bar obj( foo(i), foo() );  // complie error

2,改用 T t=T();

3,选写T make_object();

4,bar( foo a, foo b )变为bar(foo 1, foo b, ...)
bar obj( foo(i),foo(),0);

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

周星星
有没有实际用处我不知道,但我经常被它弄得焦头烂额,比如我刚才写的代码:
ifstream infile( "email.txt" );
vector<string> emails( istream_iterator<string>(infile), istream_iterator<string>() );
看起来一点错误都没有,但接着写 emails.begin() 时,编译器却说begin前必须要是一个类对象,加上IDE信息更新的滞后,导致我很久才发现这个错误。

网友评论2012-11-20 11:14:58

jzhang
比如  
也就是 foo(i) 等同于 foo i; foo() 等同于 foo (*)(void)