当前位置: 首页 > 知识库问答 >
问题:

从C #中的非常数引用捕获带有构造函数的异常类型

越正阳
2023-03-14

考虑一个结构 A,其中删除了复制构造函数,而是从非 const 引用中改为使用构造函数。是否可以抛出 A 的对象,然后按值捕获它,如示例程序中所示:

struct A {
    A() {}
    A(A&) {}
    A(const A&) = delete;
};

int main() {
    try {
        throw A{};
    }
    catch( A ) {
    }
}

GCC和Clang都允许这样的使用。尽管MSVC打印了一个错误:

C2316: 'A': cannot be caught as the destructor and/or copy constructor are inaccessible or deleted

演示:https://gcc.godbolt.org/z/P4c6Ea9fz

确实A(常数A


共有1个答案

汝墨一
2023-03-14

这是一个 MSVC 错误:异常对象从不限定 cv,并且处理程序变量是从引用它们的左值初始化的。(该标准实际上并没有说明该左值的类型是什么,但没有理由对其进行常量限定。

 类似资料:
  • 问题内容: 在C ++中,对象的生命周期从构造函数成功完成时开始。在构造函数内部,该对象尚不存在。 问:从构造函数发出异常是什么意思? 答:这意味着构造已失败,该物体从未存在,其寿命从未开始。[ 来源 ] 我的问题是:Java是否同样适用?例如,如果我移交给另一个对象,然后构造函数失败,会发生什么情况? 这个定义明确吗?现在是否有对非对象的引用? 问题答案: 该对象存在,但未正确初始化。 每当构造

  • 问题内容: 如何从枚举构造函数中引发异常?例如: 产生错误 未处理的异常类型IOException 问题答案: 由于实例是在静态初始化程序中创建的,因此请抛出ExceptionInInitializerError。

  • 问题内容: 我最近开始学习JavaFX,并从一本使用JDK 9的书中获得了此代码。运行该程序时,出现了错误。我查看了其他代码,并尝试将’@Override’和“ throws Exception”添加到start方法中,但是出现了相同的错误。构建程序时没有错误。 如果有帮助:我正在使用JDK 11.0.2和openjfx.io的JavaFX。 错误讯息: 问题答案: 如以下文档中所述,您的课程必须

  • 我有一个类(我不能修改),它只有一个构造函数,它接受一个参数,如下所示: 由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是: 但是,现在在块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在块之外声明。那么,我该如何捕捉构造函数抛出的错误呢? 编辑:为了澄清,这是在我的中,在中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输

  • 为什么这段代码不在类析构函数中调用CloseHandles 在我的代码测试中,我调用“((MyClass*)pThis)-