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将是谁的引用?