【发布时间】:2026-02-23 22:25:01
【问题描述】:
考虑一下:
#include <stdexcept>
template <class T>
void F(T &&t) {
try {
t();
} catch(...) {}
}
int main() {
F([]() noexcept {}); // Call 1
F([]{}); // Call 2
F([]{ throw std::exception{}; });// Call 3
}
我在clang++-6.0 上发现带有标志-std=c++17,无论我给出的优化标志如何,始终没有__gxx_personality 和Call 1 的任何异常处理代码。
在使用不同的编译器时可以依赖这种优化吗?我只考虑C++11及以上。
【问题讨论】:
-
@Fureeish 你能回答一下吗?
-
完成。请看下面的答案
-
@Fureeish 谢谢,终于明白
noexcept了。 -
@JiaHaoXu:我感觉题主和正文有细微差别。 “可以依赖这样的(a)优化吗?”暗示标题应该是“必须编译器总是删除一个 try-catch 块,如果它被证明是不抛出?”
-
@MSalters 标题已澄清,谢谢指出。
标签: c++ c++11 optimization exception-handling try-catch