2013-03-09 22 views
5

std::is_signed<T>std::numeric_limits<T>::is_signedの両方は、Tの署名度についての回答を返すと想定されています。
なぜ今あるのですか2つの(つまりC++ 11以降)の標識がありますか?std :: is_signedの相違点<T>とstd :: numeric_limits <T> :: is_signed?

+4

'std :: is_signed 'は型ですが、 'std :: numeric_limits :: is_signed'メンバは単なる値です。メタプログラミングでは、前者を持つ方がはるかに便利であり、より一貫性があります。 – Xeo

+1

実際には 'std :: is_signed :: value'を実際に使用します。 'std :: is_signed 'をどこで直接使用しますか? –

+0

しかし、それらの結果は今までと異なるのでしょうか? – smilingthax

答えて

7

std::numeric_limits<T>がユーザー定義型に特化している場合にのみ唯一の違いがあると思われます。そのようなユーザー定義の型はもちろん、is_signedの独自の値を提供できます。しかし、このタイプのstd::is_signed<T>::valueを求めるのは、std::is_signed<T>が独立して専門化されていない限り、常にfalseを返します。

std::is_signed<T>が表すという条件が

is_arithmetic<T>::value && T(-1) < T(0) 

更新であるかのように思え:常に-知力ハワードヒナントpoints outstd::numeric_limits<>が合法的に、専門的なことができますが、<type_traits>で何もに許可されていないこと特に明記しない限り特殊化し、is_signedは特化可能であると指定されていません。

(それが特化されていた場合)そのため、std::numeric_limits<T>::is_signedユーザー定義型のためtrueを返すことがありますがstd::is_signed<T>::valueは常にユーザー定義型のためfalseを返します。

+0

' std :: numeric_limits 'ユーザ定義型ですか? C++ 03では、ユーザが名前空間 'std'に何かを追加することは不正でした。その制限はC++ 11で解除されていますか? –

+0

@DavidHammen:いいえ、制限はありますが、専門分野には適用されません。 'std'で既存のテンプレートを特殊化することは許されています。自分のものを追加することはできません。 –

+0

@DavidHammen:クラステンプレートやオーバーロード関数/関数テンプレートを部分的に特殊化しないために、名前空間 'std'のテンプレートを完全に特殊化することは常に正当です。 – ildjarn

関連する問題