Распределение спецификаторов доступа с C ++ 0x Decktype

StackOverflow https://stackoverflow.com/questions/4704590

Вопрос

Рассмотрим следующий код:

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 и передавая его в шаблон функции, выводя тип возврата.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top