在 try catch 语句中我们可以这样做:
try{}
catch(...){}
据我所知,...
意味着任何例外。
我的问题是:为什么 C++ 标准选择这种方式(...)
而不是仅仅()
?而例如,在函数中,如果您不需要参数,则只需输入()
:
void foo();
它是否与可变参数模板有任何关系?
在 try catch 语句中我们可以这样做:
try{}
catch(...){}
据我所知,...
意味着任何例外。
我的问题是:为什么 C++ 标准选择这种方式(...)
而不是仅仅()
?而例如,在函数中,如果您不需要参数,则只需输入()
:
void foo();
它是否与可变参数模板有任何关系?
它与可变参数模板无关,因为它们出现在 C++11 中,而catch (...)
几乎从一开始就存在(大约二十年前)。
至于他们为什么选择(...)
而不是()
,你可以问 Bjarne Stroustrup,但这似乎并不重要。无论如何,此功能并不经常使用。在 C++ 中,(...)
通常表示“任何类型的任意数量的事物”,而()
通常表示“无”。根据您的观点,其中任何一个都可能更适合“捕获所有异常”。
catch()
强烈暗示没有任何东西传递给那个特定的 catch 块。
但事实并非如此,
catch(...){
throw;
}
实际上重新抛出了被捕获的异常...