我遇到了一个例子(对于一个简单的函数 - 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;
}
};
原作者在一个例子中突然添加了这种语法,我想知道这种语言结构的含义
答案 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的答案中解释过:body
和handler
是标签。标签用于goto
,并且反过来可用于流控制(确定代码应继续执行的位置)。现在,goto
应该很少使用,因为极少数情况下它们不能被其他流量控制替代(if
,for
,while
,{{1这会让它更具可读性。由于很少使用do
,因此很少使用标签。
第二个有趣的构造是函数级try块:
goto
请注意,foo::foo()
try {
} catch (std::exception const &) {
}
catch不在里面构造函数体,但实际上在外面 try
。这也是一种罕见的结构。它旨在支持在构造函数中评估初始化程序列表期间捕获异常(在上面的代码中是隐式的)。如果类型有一个基类,或构造函数可以抛出的成员,那么构造函数的主体将永远不会被评估,并且常规的try-catch对于处理该异常没有用。函数级try块也包含初始化列表,并将捕获在评估不同子成员的构造函数期间抛出的任何异常。它是一个很少使用的构造,因为你在{}
块中实际上做不了多少。已经或未被构建的确切状态是未知的,无法验证,因此唯一可能的用途是重新抛出相同的异常或不同的异常。更完整的示例中的语法是:
catch