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

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-23 15:14:17

#include

int fixedarray[2] = { 0, 1 };

int& makeref( size_t index )
{
    if( index>=2 ) throw "超出索引.";
    return fixedarray[index];
}

struct foo
{
    int& index;
    foo( size_t index_ ) try : index( makeref(index_) )
    {
        std::cout << "foo构造成功" << std::endl;
    }
    catch( const char* err )
    {
        std::cerr << "成员初始化列表错误 - " << err << std::endl;
    };
};

int main( void )
{
    try { // 下面详细解释
        foo a(0);
        std::cout << a.index << std::endl;
        foo b(2);
        std::cout << b.index <    }
    catch( ... ) {
        std::cerr << "构造不成功.\n";
    }
}

问:
为什么foo::foo中catch了异常,这里还能再次而且必须catch?

答:
因为一旦foo的成员初始化列表发生异常的话,则说明foo对象未能创建成功,所以function try blocks被设计成可以获得异常,但不消除异常。
如果C++标准不这样设计的话,那么
foo b(2);
cout << b.index; 这里的index将是谁的引用?

阅读(930) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~