彼らが新しいメソッド(そしてしばしば関数)を標準ライブラリに追加するたびに、これは起こります。
標準ライブラリタイプがあるとします。
struct example {
void do_stuff() const;
};
ものすごく単純。一部の標準リビジョンでは、新しいメソッドまたはオーバーロード、あるいはその横に次のものが追加されています。
struct example {
void do_stuff() const;
void method();
};
これにより、既存のC ++プログラムの動作を黙って変更できます。
これは、C ++の現在制限されているリフレクション機能で、そのようなメソッドが存在するかどうかを検出し、それに基づいて異なるコードを実行するのに十分であるためです。
template<class T, class=void>
struct detect_new_method : std::false_type {};
template<class T>
struct detect_new_method< T, std::void_t< decltype( &T::method ) > > : std::true_type {};
これは、新しいものを検出するための比較的簡単な方法method
であり、無数の方法があります。
void task( std::false_type ) {
std::cout << "old code";
};
void task( std::true_type ) {
std::cout << "new code";
};
int main() {
task( detect_new_method<example>{} );
}
クラスからメソッドを削除するときにも同じことが起こります。
この例ではメソッドの存在を直接検出しますが、間接的に発生するこの種のことはあまり不自然ではありません。具体的な例として、反復可能かどうかに基づいてコンテナとしてシリアル化できるかどうか、またはrawバイトを指すデータとサイズメンバーがあるかどうかを判断するシリアル化エンジンがあります。もう1つ。
標準では.data()
、コンテナにメソッドが追加され、タイプによって、シリアル化に使用するパスが突然変更されます。
C ++標準で実行できるのは、フリーズしたくない場合、サイレントにブレークするようなコードをまれにするか、何らかの理由で不合理にすることだけです。