我试图以某种方式禁用/标记为已弃用的可怕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++ 的东西?
- 如果没有“通用”(=适用于任何方法、任何类、任何函数……)解决方案,我们是否可以将某些东西应用于这种特定情况(=禁用模板类的方法,甚至可能只是一个具体实例化)?