函数try catch语法和main

Fle*_*exo 16 c++ program-entry-point exception-handling language-lawyer

一个鲜为人知但几乎从未使用过的C++特性的声明是:

void foo();
Run Code Online (Sandbox Code Playgroud)

一种可能的法律定义可能是:

void foo() try {
  throw 42;
}
catch(...) {
}
Run Code Online (Sandbox Code Playgroud)

这里包含的整个函数实现在try/ catchpair中,这似乎与允许相似.

那是合法的int main()吗?例如:

int main() try {
  throw 42;
}
catch(...) {
}
Run Code Online (Sandbox Code Playgroud)

main,n3290§3.6.1 的规则主要讨论它应该采取什么样的论据以及它返回什么 - 它们似乎并没有明确地禁止它,因为它们与你可能想要尝试的各种其他奇怪事物(例如联系)一样.

这是合法的,定义明确吗?

mat*_*ias 8

该标准不禁止内[basic.start.main]它的使用,并且,同时迫使所有的实现,以支持至少int main() {/*...*/ }int main(int argc, char* argv[]) {/*...*/},不限制实施方式中,以这两个声明(3.6.1,第2段).

从孤立的角度来看,它至少看起来是合法的,当然它只涉及函数声明,而不是函数定义.

阅读,[除了.处理]第13段说明如下:

在具有静态存储持续时间的对象的析构函数或命名空间范围对象的构造函数中抛出的异常不会被main()上的函数try-block捕获.(15.3第13段)

它使一个具体提到的功能,尽量块放置main(),这强烈暗示这种结构是合法的,并已定义的行为.添加main()仅在其名称和返回类型中特殊的信息,并且该实现可能不会使其重载以改变任何行为,这使得它以正常方式起作用的非常强烈的情况除非特别注意,例如在上面的引用中.换句话说,是的,它是合法的,定义明确的.

我在这个答案的第一个版本中提供的博客文章实际上很好地说明了上面的blockquote给出的规则,所以我将保留它的链接,即使它没有直接讨论OP的问题中的问题.

关于OP的注释,你可以在function-try-block中发出return语句,[except.handle]有这样的说法:

流出函数try-block的末尾相当于没有值的返回; 这导致值返回函数(6.6.3)中的未定义行为.(15.3第15段)

如果你最后在一个catch-block中main,你就不会流过函数体(在这种情况下会是try-block),所以main自动调用return 0;flowover 的规则不会应用.您需要返回一些int(很可能是错误代码)以防止变得不确定.

  • 从c ++ 11开始,函数块*是*函数体:-) (2认同)

归档时间:

查看次数:

3495 次

最近记录:

14 年,9 月 前