标签: exception-specification

我如何知道确切的异常类型?

我们使用CDynamicAccessor继承自CAccessorBase. 该函数MoveNext会抛出

HRESULT MoveNext() throw()

但没有说明它是什么异常类型。我怎么知道?

c++ mfc exception exception-specification

3
推荐指数
1
解决办法
65
查看次数

使用 noexcept 的程序被 msvc 和 clang 接受但被 gcc 拒绝

我正在使用此处列出的书籍学习 C++ 。特别是最近学习了使用《C++ Primer》noexcept这本书。现在,为了进一步明确我对这个主题的概念并确认我已经正确理解了事情,我正在编写简单的程序。下面给出了一个这样的程序,它可以使用 MSVC 和 Clang 编译,但不能使用 GCC 编译。演示

void f() noexcept(5) //accepted by msvc but rejected by gcc
{

}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是哪个编译器就在这里(如果有的话)?

以下是一些主要编译器的结果:

编译器 C++版本 接受代码
海湾合作委员会 C++17
海湾合作委员会 C++20
C++17 是的
C++20
MSVC C++17 是的
MSVC C++20 是的

正如我们所看到的,该程序适用于某些编译器,但不适用于其他编译器。gcc 中的错误说: error: narrowing conversion of '5' from 'int' to 'bool'

c++ exception-specification language-lawyer narrowing noexcept

3
推荐指数
1
解决办法
117
查看次数

在课外定义的默认移动操作的异常规范是什么?

考虑这个课程:

class C1 {
  C1(C1&&) = default;        // declare and define move ctor
};
Run Code Online (Sandbox Code Playgroud)

因为C1的移动ctor在其第一个声明中被明确默认,所以标准的8.4.2告诉我们它具有相同的异常规范(ES),就好像该函数已被隐式声明一样.然后我们可以使用15.4/14和12.8/15来得出其ES的结论noexcept(true).

现在考虑一个C2相同的类,除了它的移动ctor在类定义之外默认:

class C2 {
  C2(C2&&);                 // declare move ctor
}; 

C2::C2(C2&&) = default;     // define move ctor
Run Code Online (Sandbox Code Playgroud)

C2移动ctor的ES是多少?因为它的第一次声明没有违约,所以8.4.2/2不适用.因为它没有明确的ES,所以8.4.2/3不适用.因为没有隐含声明,15.4/14不适用.据我所知,这意味着15.4/12适用,它表示默认函数ES是noexcept(false).

如果我是对的,这意味着C1中的移动ctor是noexcept(true),但C2中的概念相同的移动ctor是noexcept(false).

我对C2的推理是否正确?

standards move exception-specification c++11

2
推荐指数
1
解决办法
149
查看次数

是否可以在C++虚拟(纯)类成员中提供异常?

如果是这样的话?

我知道如何为成员提供例外规范

class SOMEClass
{
public:


   void method(void)  throw (SOMEException); 

   virtual void pure_method(void) = 0;
};
Run Code Online (Sandbox Code Playgroud)

所以method只有投掷SOMEException.如果我要确保该子类SOMEClassSOMEExceptionpure_method,是不是可以添加例外规范?这种方法是可行的还是我需要更多地了解异常和抽象方法,以找出它可以(不)完成的原因?

c++ exception-specification

1
推荐指数
1
解决办法
1668
查看次数

如果继承类中没有构造函数,如何抛出异常?

我不确定这个问题是否合适,但我会尽我所能.

这是我的作业问题.如果两条线平行或相等,则作业要求我抛出异常.

原始代码由我的教授提供,我的工作是修改它以使其能够抛出异常.

line.h

class RuntimeException{
 private:
 string errorMsg;
 public:
 RuntimeException(const string& err) { errorMsg = err; }
 string getMessage() const { return errorMsg; }
};

class EqualLines: public RuntimeException{
 public:
 //empty
};

class ParallelLines: public RuntimeException{
 public:
 //empty
};

class Line{
 public:
 Line(double slope, double y_intercept): a(slope), b(y_intercept) {};
 double intersect(const Line L) const throw(ParallelLines,
                    EqualLines);
 //...getter and setter
 private:
 double a;
 double b;
};
Run Code Online (Sandbox Code Playgroud)

教授告诉我们不要修改头文件,只能修改.cpp文件.

line.cpp

double Line::intersect(const Line L) const throw(ParallelLines,
                       EqualLines){
 //below is my own code …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance exception-specification runtimeexception

0
推荐指数
1
解决办法
192
查看次数