当涉及到"问题线"的"隐藏特征"时,没有C++的爱吗?想我会把它扔出去.C++的一些隐藏功能是什么?
在派生类中调用一个受保护的构造是不允许的,因为解释在这里.
接受的答案解释了,只有当类的对象是类的子对象时,才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,这就是为什么我在这里没有得到行为差异的原因.
派生类可以在其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.[ 例子: ......
调用构造函数时是否涉及对象表达式?没有,有吗?那么标准中的哪个位置描述了受保护的基类构造函数的访问控制?
试图设计一些无异常的类,我有一个类似于此的继承结构,但是我发现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) 可能是相关的,但当然不可能.我是否忽略了允许我包含此说明符的任何其他内容,或者在这种情况下我是否只需忽略它?