Распределение спецификаторов доступа с C ++ 0x Decktype
-
11-10-2019 - |
Вопрос
Рассмотрим следующий код:
class A
{
private:
class B {};
public:
B f();
};
A a;
A::B g()
{
return a.f();
}
Компилятор отвергает это - G не может вернуть A :: B, потому что A :: B является частным.
Но предположим, что теперь я использую Decltype, чтобы указать возвращаемое значение g:
class A
{
private:
class B {};
public:
B f();
};
A a;
decltype(a.f()) g()
{
return a.f();
}
Внезапно он хорошо компилирует (с G ++> = 4,4).
Таким образом, я в основном использовал Decktype, чтобы обойти спецификатор доступа так, как я бы не смог в C ++ 98.
Это намеренное? Это хорошая практика?
Решение
Доступ применяется только к имена (и в качестве особого случая, для конструкторов/деструкторов). Это не относится к самим субъектам. Спецификация еще больше
Примечание. Поскольку контроль доступа применяется к именам, если контроль доступа применяется к имени TypedEF, рассматривается только доступность самого имени TypedEF. Доступность объекта, на которую упоминается Typedef, не учитывается. Например,
class A { class B { }; public: typedef B BB; }; void f() { A::BB x; // OK, typedef name A::BB is public A::B y; // access error, A::B is private }
- конечная нота
Так что то, что вы здесь не могли, не удивительно. Вы можете получить тип A::B
Даже в C ++ 03, при принятии адреса f
говоря &A::f
и передавая его в шаблон функции, выводя тип возврата.