C++ 面试题 目录

C++ 中 noexcept 关键字的作用是什么?

推荐答案

noexcept 是 C++11 引入的关键字,用于指定某个函数不会抛出异常。它可以用在函数声明中,表示该函数在执行过程中不会抛出任何异常。如果函数确实抛出了异常,程序会调用 std::terminate 来终止程序。

本题详细解读

1. noexcept 的基本用法

noexcept 可以用在函数声明中,表示该函数不会抛出异常。例如:

在这个例子中,myFunction 被声明为 noexcept,表示它不会抛出异常。

2. noexcept 的条件表达式

noexcept 还可以带一个布尔表达式,用于在编译时判断函数是否会抛出异常。例如:

在这个例子中,noexcept(true) 表示 myFunction 不会抛出异常。如果表达式为 false,则表示函数可能会抛出异常。

3. noexcept 与函数指针

noexcept 也可以用于函数指针的声明中,表示该函数指针指向的函数不会抛出异常。例如:

在这个例子中,funcPtr 是一个指向 noexcept 函数的指针。

4. noexcept 与移动构造函数和移动赋值运算符

在 C++11 中,标准库的许多容器(如 std::vector)在重新分配内存时会使用移动语义。如果移动构造函数或移动赋值运算符被标记为 noexcept,容器会优先使用它们来提高性能。例如:

-- -------------------- ---- -------
----- ------- -
-------
    ----------------- ------ -------- -
        -- ------
    -

    -------- ------------------- ------ -------- -
        -- -------
        ------ ------
    -
--

在这个例子中,MyClass 的移动构造函数和移动赋值运算符都被标记为 noexcept,表示它们不会抛出异常。

5. noexcept 与异常安全性

使用 noexcept 可以提高代码的异常安全性,因为它明确指出了哪些函数不会抛出异常。这有助于开发者更好地理解代码的行为,并在设计异常处理策略时做出更明智的决策。

6. noexcept 的注意事项

  • 如果 noexcept 函数确实抛出了异常,程序会调用 std::terminate 来终止程序,而不是传播异常。
  • noexcept 是函数类型的一部分,因此在函数重载时,noexcept 和非 noexcept 函数被视为不同的函数。

通过使用 noexcept,开发者可以更清晰地表达函数的异常行为,并帮助编译器进行更好的优化。

纠错
反馈