[vc++ bug] Member initialization in local class
От: Aleх  
Дата: 27.02.15 17:22
Оценка: 42 (2)
Такой код не компилируется:
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 студиях.
Re: [vc++ bug] Member initialization in local class
От: VTT http://vtt.to
Дата: 27.02.15 19:18
Оценка:
Здравствуйте, 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 написать, авось исправят.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: [vc++ bug] Member initialization in local class
От: MT-Wizard Украина  
Дата: 27.02.15 19:39
Оценка: -1
Здравствуйте, 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 студиях.

Исправлено как минимум в последнем билде фронтенда — так что следующий релиз студии будет уже без этого бага
А ти, москалику, вже приїхав (с)
Re[2]: [vc++ bug] Nested lambda and generalized capture
От: Aleх  
Дата: 28.02.15 11:30
Оценка:
Здравствуйте, 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
        }();
    };


Теряется информация о типе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.