【问题标题】:Can declaring POD types throw an exception?声明 POD 类型可以抛出异常吗?
【发布时间】:2023-03-05 22:40:01
【问题描述】:

当我声明 condition_variable 时,它可能会抛出 std::system_error

但是当我声明一个 POD 类型(例如 intdoublefloat)时呢?

喜欢下面的代码:

int main()
{
    //do something
    int i;    //will here throw exception?
}

如果声明一个POD类型可能会抛出异常,我如何保证

void test() noexcept
{
    //do something
    int i;
}

noexcept

【问题讨论】:

  • 你问有没有办法通过声明一个变量来抛出异常?
  • 是的。这就是我的意思。
  • 声明一个POD(普通旧数据:int等)类型不会抛出异常;但是,任何其他构造函数可能抛出异常。检查文档。可以看到std::condition_variable的构造函数可以抛出异常。
  • 你为什么需要这个?你想达到什么目的?
  • 致@AustinWBryan,实际上,我正在检查我的代码是否为noexcept。

标签: c++ exception noexcept exception-safety


【解决方案1】:

但是如何声明一个基本类型(例如,int、double 或 float)?

声明POD type 对象不会引发异常。

非 POD 类型的构造函数可以抛出异常。只有这些类型的文档/源代码可以帮助您确定特定类型是否会发生这种情况。

【讨论】:

    【解决方案2】:

    可以抛出异常的是std::condition_variableconstructor。像intdouble 这样的原始类型没有任何构造函数。它们只是为它们分配了一些堆栈空间,仅此而已,如果您初始化变量,则会写入一个值。这可能导致异常的唯一方法是如果您溢出堆栈并且随后的未定义行为恰好抛出一个。

    【讨论】:

      【解决方案3】:

      POD 类型通常使用初始化表达式而不是构造函数进行初始化。与构造函数一样,初始化程序也可以抛出异常。但是,如果您既没有构造函数也没有初始化程序,则没有与定义关联的代码,因此也没有可能抛出该代码。

      【讨论】:

        猜你喜欢
        • 2011-03-20
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 2014-05-06
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多