20241119

noexcept注意事项

  • 函数不能抛出异常: 如果你在一个标记为 noexcept 的函数中确实抛出了异常,程序将会调用 std::terminate(),导致程序异常终止。

  • 运算符重载: 在重载一些运算符时,如果这些运算符不应抛出异常,可以使用 noexcept

  • 性能优化: 使用 noexcept 可以帮助编译器进行某些优化,尤其是在 STL 容器和算法中,有助于提高性能。

总之,合理使用 noexcept 可以提升代码的可靠性和性能,但需要确保这些函数确实不会抛出异常。

`explicit` 关键字是 C++ 中的一个修饰符,用于防止编译器在某些情况下进行隐式类型转换。它通常用于构造函数,以避免潜在的误用或不希望的类型转换。

### 使用场景

1. **构造函数**: 当你定义一个只有单个参数的构造函数时,如果不加 `explicit`,则可以被用作隐式转换,这可能会导致意外的错误。例如:

    ```cpp
    class MyClass {
    public:
        MyClass(int value) {
            // 构造函数实现
        }
    };
    
    void func(MyClass obj) {
        // 函数实现
    }

    int main() {
        func(10); // 隐式转换,创建一个 MyClass 对象
    }
    ```

    上面的代码在调用 `func(10)` 时,会隐式地将 `int` 转换为 `MyClass`。如果我们希望防止这种隐式转换,可以使用 `explicit`:

    ```cpp
    class MyClass {
    public:
        explicit MyClass(int value) {
            // 构造函数实现
        }
    };
    
    int main() {
        func(10); // 编译错误:无法从 int 隐式转换为 MyClass
    }
    ```

2. **转换运算符**: 在类中定义转换运算符时,也可以使用 `explicit` 来防止隐式转换:

    ```cpp
    class MyClass {
    private:
        int value;
    public:
        explicit operator int() const {
            return value;
        }
    };

    int main() {
        MyClass obj;
        int x = obj; // 编译错误:无法从 MyClass 隐式转换为 int
        int y = static_cast<int>(obj); // 正确:需要显式转换
    }
    ```

### 何时使用 `explicit`

- 当你有一个只有一个参数的构造函数且希望防止隐式类型转换时,应该使用 `explicit`。
- 在定义转换运算符时,若希望只允许显式地进行类型转换,也应使用 `explicit`。

### 总结

`explicit` 提供了一种方式来控制类型转换,从而提高代码的安全性和可读性。通过使用 `explicit`,你可以确保对象的构建和转换都是明确的,避免出现不必要的隐式转换引起的错误。

新建qt项目导致异常:-1: error: dependent ‘..\..\..\..\..\..\QTCreator\6.6.3\msvc2019_64\include\QtWidgets\QMainWindow‘

使用jom代替nmake取消勾选

或者添加QMAKE_PROJECT_DEPTH = 0

或者删除 重装在c盘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值