Я пытаюсь каким-то образом отключить/пометить как устаревшую отвратительную перегрузку std::string::operator=(char)
(которая по моему опыту используется только при ошибочном назначении целочисленного числа в строку и вызывает тонкую и трудную отслеживание ошибок).
Я пробовал:
-
явная специализация со статическим утверждением в нем
#include <string> #include <type_traits> template<> std::basic_string<char> &std::basic_string<char>::operator=(char c) { static_assert(false, "Don't use this!"); }
который не работает, поскольку
<string>
уже выполняет явное инстанцированиеstd::string
- атрибут
[[deprecated]]
, примененный к аналогичному объявлению, как указано выше, в разных положениях; никакая позиция, которую я пытался, не давала никакого разумного результата; -
=delete
, который не работает по причинам, аналогичным приведенным выше; - Я думал об использовании утилит-линкера (в том же духе, в том же проекте у нас есть проверки времени выполнения при использовании stray
setlocale
с использованием компоновщика--wrap
ld
), но тот факт, что это шаблон и встроенный метод усложняет этот вопрос.
Теперь на вопросы:
- существует стандартный метод, позволяющий каким-либо образом отключить (как и при использовании
=delete
) любую функцию или метод в стандартной библиотеке (читайте: в библиотеке, где вы не можете изменять объявления в заголовках)? - как указано выше, но вместо отключения добавить предупреждение (как это было бы с
[[deprecated]]
); - В противном случае стандартный метод, есть ли что-то g++-specific?
- если нет "общего" (= применимо к любому методу, любому классу, любой функции,...) решения, есть ли что-то, что мы могли бы применить к этому конкретному случаю (= отключить метод класса шаблона, возможно даже конкретный экземпляр)?