私は何らかの形で無効にすることを試みています(私の経験では、誤って整数を文字列に割り当てて、微妙で困難なバグを追跡する場合にのみ使用されます)恐ろしいstd::string::operator=(char)
オーバーロードを非難しました。私のプロジェクトで標準ライブラリ*の関数/メソッドを非推奨(または完全に無効)としてマークする方法はありますか?
私が試した:すでに<string>
として失敗したことで、静的アサートとの明示的な特殊
#include <string>
#include <type_traits>
template<> std::basic_string<char> &std::basic_string<char>::operator=(char c) {
static_assert(false, "Don't use this!");
}
がstd::string
[[deprecated]]
属性の明示的なインスタンス化を行い、
上記と同様の宣言に様々な地位で適用される。私が試したポジションは、合理的な結果をもたらすとは思われませんでした。
=delete
これは上記の理由で失敗します。- 同じプロジェクトで、同様のプロジェクトで、
--wrap
ld
リンカオプションを使用して、迷惑行為setlocale
の使用状況に関するランタイムチェックを行っていますが、これはテンプレートとインラインメソッドであるという事実が複雑になります。質問に今
:あなたが変更することはできませんライブラリで:
- は何とか標準ライブラリ内の任意の関数やメソッド(読み(
=delete
で起こるように)無効にするための標準的な方法がありますヘッダーの宣言)? - 上記のとおりですが、無効にする代わりに、警告を追加します(
[[deprecated]]
の場合と同様)。 - 標準的な方法には失敗しました。何かg ++固有のものがありますか?
- "一般的な"(任意のメソッド、クラス、関数などに適用可能)解決策がない場合、この特定のケースに適用できるものがありますか(=可能であればテンプレートクラスのメソッドを無効にします。特定のインスタンス化だけでも)?
静的なアサートまたは削除された関数を使用しようとしている場合は、おかしな定義があります。 –
@JonathanWakely: "廃止予定または全部停止";しかし、私が考えている限り、それは本質的に同じですが、とにかくそのような警告に '-Werror'を使用すると、その代入演算子を使用する正当な理由はありません(' gets 'または文字列リテラル=>' 'char *' 'の変換)を使用します。 –