Такой код не компилируется:
struct XXX
{
void bar()
{ }
void foo()
{
class YYY
{
int x = 123;
};
bar(); // < error C2352: 'XXX::bar': illegal call of non-static member function
}
};
Видимо при выходе из скоупа компилятор не восстанавливает контекст. Баг содержится как в 2013, так и в 2015 студиях.
Здравствуйте, Aleх, Вы писали:
A>Такой код не компилируется:
A>A>struct XXX
A>{
A> void bar()
A> { }
A> void foo()
A> {
A> class YYY
A> {
A> int x = 123;
A> };
A> bar(); // < error C2352: 'XXX::bar': illegal call of non-static member function
A> }
A>};
A>
A>Видимо при выходе из скоупа компилятор не восстанавливает контекст. Баг содержится как в 2013, так и в 2015 студиях.
Мне кажется, что это далеко не единственная проблема в реализации поддержки local классов в студии. Даже когда все собирается без ошибок, случались проблемы при отладке и странное поведение в релиз сборках. local классы это не самая популярная (и не самая полезная) особенность языка, наверное поэтому им уделяют мало внимания.
А вообще стоило бы сразу на
http://connect.microsoft.com/VisualStudio написать, авось исправят.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, Aleх, Вы писали:
A>Такой код не компилируется:
A>A>struct XXX
A>{
A> void bar()
A> { }
A> void foo()
A> {
A> class YYY
A> {
A> int x = 123;
A> };
A> bar(); // < error C2352: 'XXX::bar': illegal call of non-static member function
A> }
A>};
A>
A>Видимо при выходе из скоупа компилятор не восстанавливает контекст. Баг содержится как в 2013, так и в 2015 студиях.
Исправлено как минимум в последнем билде фронтенда — так что следующий релиз студии будет уже без этого бага
Здравствуйте, MT-Wizard, Вы писали:
MW>Исправлено как минимум в последнем билде фронтенда — так что следующий релиз студии будет уже без этого бага
А этот баг исправлен?
Простая generalized capture вполне нормально работает:
std::vector<int> a = {1, 2, 3};
auto x = [a = std::move(a)] () {
a[1];
};
А во вложенной лямбде уже нет.
auto y = [a = std::move(a)] () {
[&] () {
a[1]; // error C2109: subscript requires array or pointer type
}();
};
Теряется информация о типе.