c – 如何在我的项目中将*标准库*函数/方法标记为已弃用(或完全
我试图以某种方式禁用/标记为不赞成使用hideous 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进行了明确的实例化 现在问题: 有没有一个标准的方法,以某种方式禁用(就像delete一样)标准库中的任何函数或方法(读取:在一个库中,您不能更改标题中的声明)? 解决方法
您可以使用以下编译器/链接器选项:
$g++ -O0 test.cpp -Wl,--wrap=_ZNSsaSEc 说明: _ZNSsaSEc是您的违规功能的装饰名称: $echo _ZNSsaSEc | c++filt std::basic_string<char,std::char_traits<char>,std::allocator<char> >::operator=(char) -Wl编译器选项是将选项传递给链接器. 而–wrap =< symbol>链接器选项将对给定符号的任何引用转换为替代__wrap_< symbol>.而且既然(希望)没有定义一个名为__wrap__ZNSsaSEc的函数,你会得到一个很好的链接器错误: test.cpp:(.text+0x26): undefined reference to `__wrap__ZNSsaSEc' 而-O0是禁用优化,并阻止编译器内联函数.如果有内联的链接技巧将不起作用,因为@SergeBallesta在注释中指出. 也许是一个黑客,但嘿,它的作品! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |