【发布时间】:2012-01-14 09:04:57
【问题描述】:
一个鲜为人知但几乎从未使用过的 C++ 特性被声明:
void foo();
一种可能的法律定义是:
void foo() try {
throw 42;
}
catch(...) {
}
这里是whole function implementation wrapped is within a try/catch pair,似乎类似于允许this。
int main() 这样做合法吗?例如:
int main() try {
throw 42;
}
catch(...) {
}
The rules for main, n3290 § 3.6.1 主要谈论它应该采用什么参数以及它返回什么 - 他们似乎没有像处理其他各种奇怪的事情(例如链接)那样明确禁止它,你可能会受到诱惑试试看。
这是否合法且定义明确?
【问题讨论】:
-
有趣的学术问题,虽然我不确定它有多少实际用途。 stackoverflow.com/a/620817/10077
-
合法吗?从技术上讲,大多数编译器都会支持它。定义好?不是真的,因为我当然想不出任何理智的理由这样做。
-
@AJG85 - 我的意思是在“既不调用未定义的行为,也不调用实现定义的行为”的意义上定义良好,而不是以“在常见实现中经过良好测试”的方式
-
@awoodland:在那种情况下,正如您所指出的那样,标准并没有说太多。它将留给编译器实现,因此会有很大差异。
-
@AJG85 - 如果它留给编译器,那么它是实现定义的,并将在标准后面的“实现定义的行为索引”中。
标签: c++ exception-handling main language-lawyer