Использование объявлений и константных перегрузок

Предположим, у меня есть две версии operator-> (перегружен на const) в базовом классе. Если я говорю

using Base::operator->;

в производном классе я получу доступ к обеим версиям или только к неконстантной?

3 ответа

Решение

Тот же бизнес, что и имя, скрывающееся. Это все или ничего. Использование объявлений (7.3.3) приносит имя, а не участника.

ИСО / МЭК 14882 (2003), 7.3.3. 1/ A-декларация использования вводит имя в декларативную область, в которой появляется декларация использования. Это имя является синонимом имени некоторой сущности, объявленной в другом месте.

Я призываю вас прочитать 7.3.3, внутри есть тонкие вещи. Вы не можете использовать-объявлять шаблон, все члены, на которые ссылается имя, которое вы используете-объявляете, должны быть доступны, имена учитываются для разрешения перегрузки вместе с именами в блоке, где находится объявление использования (т. Е. Они ничего не скрывают) и т. д. и т. д.

Вы получаете доступ ко всем версиям метода / оператора с одинаковым именем в этом родительском элементе.

И то и другое. ты пробовал это? (блин, этот ответ короткий: ну, вот пример:

#include <iostream>
#include <string>

struct bar
{
  void foo() { std::cout << "non_c:foo()" << std::endl; }
  void foo() const { std::cout << "c:foo()" << std::endl; }
};

class base
{
public:
  bar* operator->() { return &b; }
  bar const* operator->() const { return &b; }

private:
  bar b;  
};

class derived : public base
{
public:
  using base::operator->;
};


int main(void)
{
  const derived d = derived();
  derived e;

  d->foo();
  e->foo();
}
Другие вопросы по тегам