Код: Выделить всё
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();
}
- работает всегда (независимо)
Код: Выделить всё
Global::value - сам по себе не работает для зависимых членов базы
Код: Выделить всё
value - или Base::value всегда работают
Код: Выделить всё
this->value
Мои вопросы:
- Почему добавление локального элемента меняет правила поиска для зависимых членов базового класса?
/> - Это поведение двухфазного поиска намеренно или ошибка компилятора?
- Почему стандарт требует явного указания this-> для зависимых базовых членов, но не для полных типов?
- Какова реальная последовательность поиска, которая заставляет локальный член «затенять» базовый статический элемент в этом контексте?
Подробнее здесь: https://stackoverflow.com/questions/798 ... rough-a-de
Мобильная версия