5

昨日、誰かの質問に答える過程で、gcc 4.7.2にの逆として定義され<type_traits>た trait template が含まれていることを発見して驚きました。std::is_explicitly_convertible<From,To>std::is_constructible_convertible<To,From>

/// is_explicitly_convertible
template<typename _From, typename _To>
struct is_explicitly_convertible
: public is_constructible<_To, _From>
{ };

paper-trail を検索したところ、この特性は存在しないはずであることがわかりました。その バージョンの C++11 標準ライブラリに含めることに対してバグが発生し、gcc 4.8.0 で削除されました。

そのバグ レポートは、std::is_explicitly_convertible(C++0x 標準の以前のドラフトで義務付けられていた) が2010 年にN3047によって標準ドラフトから削除されたことを指摘し ました。

N3047 は、この回り道について次のように説明しています。

残りの問題は、影響を受けたis_explicitly_convertible特性をどのように修復するかです。基本的な選択肢は次のとおりです。

  1. is_explicitly_convertible現在の式に戻って修正し、 に依存しstatic_castなくなります。is_explicitly_convertibleis_constructible
  2. 標準から削除is_explicitly_convertibleします。

最初の選択肢が検討されましたが、「明示的に変換可能」が実際に何を意味するかについて、まったく異なる理解が存在することが判明しました。がこれを正しく表現していると信じている人もstatic_castいれば、fixedis_constructibleの方がより良い意味を提供すると信じている人is_explicitly_convertibleもいます。したがって、この文書でis_explicitly_convertibleは、作業草案から を削除することをお勧めします。その特別な定義にはまだ何も依存していないため、これは今のところ害はありません。そして、その特性が依然として有用であることが判明した場合、標準の別の改訂版に追加される可能性があります.

fromこの説明は、意見の不一致の当事者が、 type の式についてFromstatic_cast<To>(from)コンパイルされるがコンパイルされないケースを知っていたことを暗示しているようTo to{from};です。またはその逆。

そのようなケースはありますか?

Fromそうでない場合、ここで機能していたtoの static_castibility と from の構築可能性の違いを正式に (投機的にではなく) 説明できToますか?ToFrom

4

1 に答える 1

2

まず、いくつかのテスト コードです。 TestAあなたの明示的な構造であり、TestBあなたの明示的なstatic_castingです:

template<typename To, typename From>
To TestA(From from) {
  To to{from};
  return to;
}
template<typename To, typename From>
To TestB(From from) {
  return static_cast<To>(from);
}

static_castオブジェクト階層でのダウンキャストは許可されますが、明示的な構築では次のことはできません。

struct Base {};
struct Derived:Base {};

int main() {
  Base* b;
  // TestA<Derived*>(b); -- fails to compile
  TestB<Derived*>(b);
}
于 2013-06-06T11:19:21.027 に答える