среда, 15 июня 2016 г.

Чёртова студия (13) и указатели на методы

Несколько дней прободался с падением юнит теста при сборке его 13 студией (gcc, clang, msvc2015 - всё ок). Фишка оказалась вот в чём.

Чтобы не писать многа апсалютна непанятных букаф я завёл вспомогательный шаблон

template<typename C, typename T>
using member_ptr = T C::*;
Фишка в том, что если в качестве типа использовать сигнатуру функции, то мы получим указатель на метод, например
member_ptr<std::string, void(size_t)> reserve =
    &std::string::reserve;
std::string val;
val.*reserve(5);
Шаблон дичайше удобен, но! 13 студия считает, что у такого указателя на функцию тип будет "указатель на функцию член с конвенцией вызова __cdecl" (не очень разбираюсь в виндовых конвенциях вызова, но кажется что для нестатической функции члена это бессмыслица). С этой самой точки всё и отправляется в гости к маленькому пушному зверьку с ценным мехом ибо вызов через такой указатель на метод будет использовать неправильное ABI передачи параметров.

Не совсем понимаю почему это компилировалось в боевом коде, но на тестовом консольном приложении меня забрил компилятор, заявив, что имеет место быть попытка присвоения переменной значения несовместимого типа.