带函数体的C ++冒号语法

时间:2013-06-27 01:40:44

标签: c++ goto colon

我遇到了一个例子(对于一个简单的函数 - try-block),从中可以利用其中一个比较模糊的C ++语法方面(就像语言的大多数模糊方面)我可以似乎找不到文档。

我搜索谷歌无济于事,所有搜索都返回(相当无用)仅用于构造函数初始化(我熟悉),但我想知道的是重要性此构造函数块中的body:handler:语句:

class foo{
    foo() try
    //initalizer list that could throw
    {
    body:
       //do stuff that could possibly throw
    } catch(std::exception &e) {
    handler:
       throw;
    }
};

原作者在一个例子中突然添加了这种语法,我想知道这种语言结构的含义

2 个答案:

答案 0 :(得分:5)

XXX:是一个标签。它在您发布的代码中不起任何功能作用。作者可能已经提出它来帮助他们组织代码。

你可以使用带有goto语句的标签,就像在goto XXX;中一样跳转到代码中的那一点,虽然我会让你自己决定这是一个好的想法还是现在。

答案 1 :(得分:1)

foo::foo()
try
{
body:
   //... do stuff that could possibly throw
}
catch(std::exception &e){
handler:
   throw;
}

这段代码有两个相当不寻常的结构。第一个是您已经指出并且已经在mjk的答案中解释过:bodyhandler是标签。标签用于goto,并且反过来可用于流控制(确定代码应继续执行的位置)。现在,goto应该很少使用,因为极少数情况下它们不能被其他流量控制替代(ifforwhile,{{1这会让它更具可读性。由于很少使用do,因此很少使用标签。

第二个有趣的构造是函数级try块:

goto

请注意,foo::foo() try { } catch (std::exception const &) { } catch不在里面构造函数体,但实际上外面 try。这也是一种罕见的结构。它旨在支持在构造函数中评估初始化程序列表期间捕获异常(在上面的代码中是隐式的)。如果类型有一个基类,或构造函数可以抛出的成员,那么构造函数的主体将永远不会被评估,并且常规的try-catch对于处理该异常没有用。函数级try块也包含初始化列表,并将捕获在评估不同子成员的构造函数期间抛出的任何异常。它是一个很少使用的构造,因为你在{}块中实际上做不了多少。已经或未被构建的确切状态是未知的,无法验证,因此唯一可能的用途是重新抛出相同的异常或不同的异常。更完整的示例中的语法是:

catch