Я пытаюсь каким-то образом отключить/пометить как устаревшую отвратительную перегрузку 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
, который не работает по причинам, аналогичным вышеуказанным;- Я думал об использовании трюков с компоновщиком (в том же духе, в том же проекте у нас есть проверки времени выполнения на случайные
setlocale
использования с использованием опции компоновщика--wrap
ld
), но тот факт, что это шаблон и встроенный метод, усложняет дело.
Теперь к вопросам:
- существует ли стандартный способ как-то отключить (как это произошло бы с
=delete
) любую функцию или метод в стандартной библиотеке (читай: в библиотеке, где вы не можете изменить объявления в заголовках)? - как выше, но вместо отключения добавить предупреждение (как было бы с
[[deprecated]]
); - если стандартный метод не работает, есть ли что-то специфичное для g++?
- если нет "общего" (= применимого к любому методу, любому классу, любой функции, ...) решения, есть ли что-то, что мы могли бы применить к этому конкретному случаю (= отключить метод класса шаблона, возможно, даже просто конкретный экземпляр)?
-Werror
в таком предупреждении в любом случае, нет веской причины использовать этот оператор присваивания (точно так же, как нет причин использовать, скажем,gets
или строковый литерал =›char *
преобразование помимо совместимости с устаревшим кодом). - person Matteo Italia   schedule 18.11.2015