为什么noexcept说明符不在声明的方法范围内?

mon*_*506 5 c++ noexcept c++11

试图设计一些无异常的类,我有一个类似于此的继承结构,但是我发现noexcept说明符在使用成员函数时几乎没有帮助,因为说明符没有作为函数内的范围.

class Base
{
protected:
    Base() noexcept {}
};

class Derived : public Base
{
public:
    // error: 'Base::Base()' is protected
    Derived() noexcept(noexcept(Base{})) : Base{} {}

    // error: 'foo' was not declared in this scope
    Derived(int) noexcept(noexcept(foo())) {}

    // error: invalid use of 'this' at top level
    Derived(float) noexcept(noexcept(this->foo())) {}

    void foo() noexcept {}
};
Run Code Online (Sandbox Code Playgroud)

演示

这可能是C++ 17中正在改进的东西吗?试图搜索这个没有产生相关结果.现在我已经辞职了一些非常丑陋(可能是不正确的)尝试noexcept(noexcept(static_cast<Derived*>(nullptr)->foo())),但这对基类构造函数的情况没有帮助,它受到保护.

目前是否可以声明一个引用受保护的基类方法的noexcept说明符?noexcept(auto) 可能是相关的,但当然不可能.我是否忽略了允许我包含此说明符的任何其他内容,或者在这种情况下我是否只需忽略它?

Kur*_*man 2

您可以通过使用 Base 构造函数位于如下范围内的表达式来解决此问题:

struct test_base : public Base {};

Derived() noexcept(noexcept(test_base())) : Base() {}
Run Code Online (Sandbox Code Playgroud)

Base()我相信你不能直接使用的原因与这个问题有关。

protected 访问说明符的工作方式是,仅当类 A 的对象是类 B 的子对象时,它才允许派生类 B 访问基类 A 的对象的内容。这意味着您在代码中唯一可以做的事情就是通过B访问A的内容:可以通过B*类型的指针(或者B&类型的引用)来访问A的成员。但是您无法通过 A * 类型的指针(或引用 A &)访问相同的成员。

这就像你有一个这样的成员函数一样:

void badfunc()
{
    B b;
}
Run Code Online (Sandbox Code Playgroud)

您尝试Base直接使用 的构造函数而不是通过 Derived. 当您在构造函数初始化列表中初始化基类时,这是一个特殊的上下文,允许您调用构造函数,因为您将其作为初始化的一部分进行Derived。