Я думаю, что путаница здесь проистекает из того, в чем смысл контекста полного класса и как он предназначен для использования.
Важно, что поиск имени найдет там i
,Таким образом, я могу написать это:
struct A {
struct B {
int j = 2;
int f() {
using T = decltype(i); // ok, even though 'i' declared later lexically
return T{} + j; // ok
}
};
int i = 1;
};
А также:
struct A {
struct B {
int j = 2;
int f() {
return i + j; // ok, even though 'i' declared later lexically
}
};
static const int i = 1;
};
Действительно, все это было хорошо в C ++ 11.
Ноi
все еще нестатический член, поэтому вы можете получить к нему доступ только из контекста объекта типа A
.В теле функции-члена B
у нас неявно есть объект A
.Так что такое бесплатное использование i
все еще плохо сформировано.
Тем не менее, это:
Я предполагаю, что компилятор GCC все еще не соответствует последней версии.
Это, безусловно, правда, и останется верным еще довольно долго.