Приветствую.
Вот код:
#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)'
ЧЯДНТ?
Здравствуйте, 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
Здравствуйте, 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;
};
Здравствуйте, 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 прав.
Здравствуйте, 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;
}