Сообщение Re[3]: Определить создаваемость объекта на куче от 04.10.2022 12:26
Изменено 04.10.2022 12:39 vopl
Re[3]: Определить создаваемость объекта на куче
Здравствуйте, Went, Вы писали:
W>Здравствуйте, rg45, Вы писали:
R>>Как я догадываюсь, концепты не предлагать? Тогда старый добрый SFINAE...
W>Супер, работает! Честно сказать, я искал ошибку в чужом коде, и там было сделано приблизительно так (обрати внимание на void):
W>
W>В результате, для объектов, у которых определен пользовательский оператор new и защищенный деструктор, VS2019 кидало ошибку, так как почему-то пыталось получить доступ к деструктору (точнее, из-за SFINAE молча разрешалось в общую форму шаблона). Я вроде пытался сделать без void, но что-то тоже не работало.
Так у тебя вторым параметром шаблона заявляется функция void(T*), для нее чтобы вывести T* идет обращение на operator new, если он закрыт или удален — будет ошибка.
Вот так работает:
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>В результате, для объектов, у которых определен пользовательский оператор new и защищенный деструктор, VS2019 кидало ошибку, так как почему-то пыталось получить доступ к деструктору (точнее, из-за SFINAE молча разрешалось в общую форму шаблона). Я вроде пытался сделать без void, но что-то тоже не работало.
Так у тебя вторым параметром шаблона заявляется функция void(T*),для нее чтобы вывести T* идет обращение на operator new, если он закрыт или удален — будет ошибка Это я прогнал. Просто детектор не работает как должно в этом случае, не правильно определяет. И, видимо, на основании не правильной детекции, уже в другом коде идет попытка вызова new и там возникает ошибка..
Вот так работает:
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*),
Вот так работает:
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 {};