Почему C++ по-разному обрабатывает один и тот же статический член при доступе через зависимый базовый класс по сравнениюC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему C++ по-разному обрабатывает один и тот же статический член при доступе через зависимый базовый класс по сравнению

Сообщение Anonymous »

Меня смущает то, как C++ обрабатывает доступ к статическим элементам в шаблонах, когда задействованы наследование и зависимые имена. Посмотрите на этот код:

Код: Выделить всё

struct Global {
static int value;
};

template
struct Base {
static int value;
};

template
struct Derived : Base {  // Base is dependent
void test() {
// Case 1: Direct access - always works
Global::value = 1;

// Case 2: Through dependent base - sometimes requires 'this->'
value = 2;        // ✗ Clang/GCC: error, MSVC: warning
this->value = 3;  // ✓ All compilers accept
Base::value = 4; // ✓ Also works

// Case 3: But if I add a local member, behavior changes
// int value;  // Uncommenting this makes 'value = 2' work! Why?
}
};

int main() {
Derived d;
d.test();
}
Что меня сбивает с толку: Самое запутанное: если я добавляю локальный элемент value, внезапно value = 2 компилируется, но ссылается на локальный элемент, а не на статический!
Мои вопросы:
  • Почему добавление локального элемента меняет правила поиска для зависимых членов базового класса?
    />
  • Это поведение двухфазного поиска намеренно или ошибка компилятора?
  • Почему стандарт требует явного указания this-> для зависимых базовых членов, но не для полных типов?
  • Какова реальная последовательность поиска, которая заставляет локальный член «затенять» базовый статический элемент в этом контексте?
Это кажется непоследовательным — одно и то же значение имени ведет себя совершенно по-разному в зависимости от того, является ли базовый класс зависимым и существуют ли локальные члены.

Подробнее здесь: https://stackoverflow.com/questions/798 ... rough-a-de
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»