c++ lambda wtf
От: lost_guadelenn  
Дата: 02.09.11 09:05
Оценка:
Приветствую.

Вот код:
#include <functional>

int _tmain(int argc, _TCHAR* argv[])
{
    enum E { a, b, c };
    E e = a;

    std::function<void ()> parseArgs = [&] () -> void {
        e = b;
    };

    return 0;
}


не компилируется с ошибкой (MS VS 2010)
1>c:\test_lambda\test_lambda.cpp(14): error C2665: '`anonymous-namespace'::<lambda0>::<lambda0>' : none of the 2 overloads could convert all the argument types
1>          c:\test_lambda\test_lambda.cpp(14): could be '`anonymous-namespace'::<lambda0>::(wmain::E &,wmain::E &)'
1>          while trying to match the argument list '(wmain::E, wmain::E)'


ЧЯДНТ?
Re: c++ lambda wtf
От: uzhas Ниоткуда  
Дата: 02.09.11 09:41
Оценка:
Здравствуйте, lost_guadelenn, Вы писали:

_>не компилируется с ошибкой (MS VS 2010)


упс
у меня вот такой вариант уронил компилятор

    enum E { a, b, c };
    E e = a;

    std::function<void ()> parseArgs = [&, e, b] () -> void {
      e = (E)b;
    };

explicit cast пришлось добавить, потому что выдавалась ошибка

error C2440: '=' : cannot convert from 'const int' to 'E'
Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)


в общем, рекомендую почитать здесь: http://msdn.microsoft.com/en-us/library/dd293603.aspx
у гцц полет нормальный: http://ideone.com/pFfPY
Re: c++ lambda wtf
От: Kolobrodin Россия  
Дата: 02.09.11 14:05
Оценка:
Здравствуйте, lost_guadelenn, Вы писали:

_>Приветствую.


_>Вот код:

_>
_>#include <functional>

_>int _tmain(int argc, _TCHAR* argv[])
_>{
_>    enum E { a, b, c };
_>    E e = a;

_>    std::function<void ()> parseArgs = [&] () -> void {
_>        e = b;
_>    };

_>    return 0;
_>}
_>


_>не компилируется с ошибкой (MS VS 2010)

_>
1>>c:\test_lambda\test_lambda.cpp(14): error C2665: '`anonymous-namespace'::<lambda0>::<lambda0>' : none of the 2 overloads could convert all the argument types
1>>          c:\test_lambda\test_lambda.cpp(14): could be '`anonymous-namespace'::<lambda0>::(wmain::E &,wmain::E &)'
1>>          while trying to match the argument list '(wmain::E, wmain::E)'
_>


_>ЧЯДНТ?


А так сработает?
std::function<void ()> parseArgs = [&e] () -> void {
        e = b;
    };
Неоконченная мысль всегда казалась Шри Япутре слишком
Re: c++ lambda wtf
От: _nn_ www.nemerleweb.com
Дата: 04.09.11 10:09
Оценка:
Здравствуйте, lost_guadelenn, Вы писали:

workaround вынести enum E за пределы main.
enum E { a, b, c};

int _tmain()
{
     E e;
     auto parseArgs = [&]() { E p = a; };
}


Кстати, "-> void" писать не обязательно.

P.S.
ICE:
int _tmain()
{
    enum E { a, b, c };
    auto parseArgs = []() { E p = a; };

    return 0;
}


P.P.S.
Как компилятор должен себя вести при локальном классе?
int main()
{
        struct A { enum E { a, b, c }; };
        auto parseArgs = []() { A::E x = A::a; };
 
        return 0;
}


GCC компилирует успешно, MSVC обламывается.
Вероятнее всего GCC прав.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: c++ lambda wtf
От: gegMOPO4  
Дата: 05.09.11 13:54
Оценка:
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, lost_guadelenn, Вы писали:
__>workaround вынести enum E за пределы main.

Вот ведь, только разрешили локальные классы в шаблонах использовать.
Re: c++ lambda wtf
От: _nn_ www.nemerleweb.com
Дата: 06.09.11 07:10
Оценка:
Здравствуйте, lost_guadelenn, Вы писали:

Еще один воркэраунд, правда без лямбды:
template<typename T>
struct assign_func : std::binary_function<T, T, void>
{    
    void operator()(T& l, T r) const { l = r; }
};

enum E { a, b, c };

E p = b;

auto parseArgs = std::bind(assign_func<E>(), p, a);


И еще один ICE:
int main()
{
    enum E { a, b, c };

    E p = b;

    [&]() { (E&)p = a; }();

    return 0;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.