私はどうにかして恐ろしい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 ++固有のものはありますか?
- 「一般的な」(= 任意のメソッド、任意のクラス、任意の関数などに適用できる) 解決策がない場合、この特定のケースに適用できるものはありますか (= テンプレート クラスのメソッドを無効にします。特定のインスタンス化)?