相关疑难解决方法(0)

C++的隐藏功能?

当涉及到"问题线"的"隐藏特征"时,没有C++的爱吗?想我会把它扔出去.C++的一些隐藏功能是什么?

c++ hidden-features

114
推荐指数
38
解决办法
8万
查看次数

为什么允许在派生类中调用受保护的静态方法?

在派生类中调用一个受保护的构造是不允许的,因为解释在这里.

接受的答案解释了,只有当类的对象是类的子对象时,才protected允许访问基类对象的成员.到现在为止还挺好.AAB

但是,为什么允许(至少在GCC 4.6.3中)调用静态保护方法?具体来说,以下编译对我来说没有任何意义,而注释行没有:

class A 
{
protected:
    A() {}
    static A makeA() { return A(); }
};

class B: public A
{
public:
    static A makeAFromB()
    {
        return makeA(); // compiles
        // return A();  // does not compile
    }
};
Run Code Online (Sandbox Code Playgroud)

从哲学上讲,构造函数非常类似于返回类对象的静态方法A,这就是为什么我在这里没有得到行为差异的原因.

c++ inheritance

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

访问受保护的基类构造函数

派生类可以在其ctor-initializer中调用受保护的基类构造函数,但仅适用于其自己的基类子对象,而不是其他地方:

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

class Derived : Base {
  Base b;
  public:
    Derived(): Base(),    // OK
               b() {      // error
        Base b2;          // error
    }
};
Run Code Online (Sandbox Code Playgroud)

标准对此有何看法?这是[class.protected]/1:

当非静态数据成员或非静态成员函数是其命名类的受保护成员时,将应用超出第11章中所述之外的其他访问检查(11.2)如前所述,授予对受保护成员的访问权限,因为引用发生在朋友或某个类的成员中C.如果访问要形成指向成员的指针(5.3.1),则嵌套名称说明符应表示C或派生自的类C.所有其他访问都涉及(可能是隐式的)对象表达式(5.2.5).在这种情况下,对象表达式C的类应该是派生自的类C.[ 例子: ......

调用构造函数时是否涉及对象表达式?没有,有吗?那么标准中的哪个位置描述了受保护的基类构造函数的访问控制?

c++ oop language-lawyer

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

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

试图设计一些无异常的类,我有一个类似于此的继承结构,但是我发现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) 可能是相关的,但当然不可能.我是否忽略了允许我包含此说明符的任何其他内容,或者在这种情况下我是否只需忽略它?

c++ noexcept c++11

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