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

Сообщение Re[3]: Определить создаваемость объекта на куче от 04.10.2022 12:26

Изменено 04.10.2022 12:39 vopl

Re[3]: Определить создаваемость объекта на куче
Здравствуйте, Went, Вы писали:

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


R>>Как я догадываюсь, концепты не предлагать? Тогда старый добрый SFINAE...

W>Супер, работает! Честно сказать, я искал ошибку в чужом коде, и там было сделано приблизительно так (обрати внимание на void):

W>
W>#include <iostream>
W>#include <type_traits>

W>template <typename T, typename = void>
W>struct is_new_available : std::false_type {};

W>template <typename T>
W>struct is_new_available<T, void(decltype(new T()))> : std::true_type {};
W>


W>В результате, для объектов, у которых определен пользовательский оператор new и защищенный деструктор, VS2019 кидало ошибку, так как почему-то пыталось получить доступ к деструктору (точнее, из-за SFINAE молча разрешалось в общую форму шаблона). Я вроде пытался сделать без void, но что-то тоже не работало.


Так у тебя вторым параметром шаблона заявляется функция void(T*), для нее чтобы вывести T* идет обращение на operator new, если он закрыт или удален — будет ошибка.
Вот так работает:
template <typename T, typename = void>
struct is_new_available : std::false_type {};

template <typename T>
struct is_new_available<T, std::void_t<decltype(new T())>> : std::true_type {};
Re[3]: Определить создаваемость объекта на куче
Здравствуйте, Went, Вы писали:

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


R>>Как я догадываюсь, концепты не предлагать? Тогда старый добрый SFINAE...

W>Супер, работает! Честно сказать, я искал ошибку в чужом коде, и там было сделано приблизительно так (обрати внимание на void):

W>
W>#include <iostream>
W>#include <type_traits>

W>template <typename T, typename = void>
W>struct is_new_available : std::false_type {};

W>template <typename T>
W>struct is_new_available<T, void(decltype(new T()))> : std::true_type {};
W>


W>В результате, для объектов, у которых определен пользовательский оператор new и защищенный деструктор, VS2019 кидало ошибку, так как почему-то пыталось получить доступ к деструктору (точнее, из-за SFINAE молча разрешалось в общую форму шаблона). Я вроде пытался сделать без void, но что-то тоже не работало.


Так у тебя вторым параметром шаблона заявляется функция void(T*), для нее чтобы вывести T* идет обращение на operator new, если он закрыт или удален — будет ошибка Это я прогнал. Просто детектор не работает как должно в этом случае, не правильно определяет. И, видимо, на основании не правильной детекции, уже в другом коде идет попытка вызова new и там возникает ошибка..
Вот так работает:
template <typename T, typename = void>
struct is_new_available : std::false_type {};

template <typename T>
struct is_new_available<T, std::void_t<decltype(new T())>> : std::true_type {};