Информация об изменениях

Сообщение Re: Yet another MSVC 2015 decltype bug? от 04.04.2016 14:35

Изменено 04.04.2016 15:09 B0FEE664

Здравствуйте, SaZ, Вы писали:

SaZ>Это студия тупит или я чего-то не понимаю? В студии не компилируется — говорит, что cannot convert argument 1 from 'void (__thiscall Test::* )(void)' to 'Fn (__thiscall &&)'.

SaZ>Я так понимаю, что студия считает, что Test::fooN<1> это перегрузка. Но, перегрузка — это когда имя метода совпадает, а сигнатуры отличаются. Тут же сигнатуры совпадают, а имена методов — хз

Я не знаю как оно должно быть, но вот так компилируется и запускается:
    auto aF1 =  &Test::fooN<1>;
    using Fn1 = decltype(aF1);
    test.invoke<Fn1>( &Test::fooN<1> );
    test.invoke<Fn1>( &Test::foo );



PS Короче, это bug MS
https://connect.microsoft.com/VisualStudio/feedback/details/775434/decltype-is-buggy-in-vs-2012
https://connect.microsoft.com/VisualStudio/feedback/details/1029542

Исправлять отказываются, предлагают обход:
    template <typename T> T identity(T);
...
    using a = decltype(identity(&Test::fooN<1>));
    test.invoke<Fn>( &Test::foo );
    test.invoke<Fn1>( &Test::fooN<1> );
Re: Yet another MSVC 2015 decltype bug?
Здравствуйте, SaZ, Вы писали:

SaZ>Это студия тупит или я чего-то не понимаю? В студии не компилируется — говорит, что cannot convert argument 1 from 'void (__thiscall Test::* )(void)' to 'Fn (__thiscall &&)'.

SaZ>Я так понимаю, что студия считает, что Test::fooN<1> это перегрузка. Но, перегрузка — это когда имя метода совпадает, а сигнатуры отличаются. Тут же сигнатуры совпадают, а имена методов — хз

Я не знаю как оно должно быть, но вот так компилируется и запускается:
    auto aF1 =  &Test::fooN<1>;
    using Fn1 = decltype(aF1);
    test.invoke<Fn1>( &Test::fooN<1> );
    test.invoke<Fn1>( &Test::foo );



PS Короче, это bug MS
https://connect.microsoft.com/VisualStudio/feedback/details/775434/decltype-is-buggy-in-vs-2012
https://connect.microsoft.com/VisualStudio/feedback/details/1029542

Исправлять отказываются, предлагают обход:
    template <typename T> T identity(T);
...
    using a = decltype(identity(&Test::fooN<1>));
    test.invoke<a>( &Test::foo );
    test.invoke<a>( &Test::fooN<1> );