8

通常、タイプがであるかどうかを検出する必要がある場合は、constを使用しますboost::is_const。しかし、ネストされた型の定数を検出しようとすると問題が発生しました。constタイプに特化した次のトレイトテンプレートについて考えてみます。

template <class T>
struct traits
{
    typedef T& reference;
};

template <class T>
struct traits<const T>
{
    typedef T const& reference;
};

問題は、それがタイプboost::is_constであることを検出していないように見えることです。traits<const T>::referenceconst

例えば:

std::cout << std::boolalpha;
std::cout << boost::is_const<traits<int>::reference>::value << " ";
std::cout << boost::is_const<traits<const int>::reference>::value << std::endl;

これは以下を出力します:false false

なぜ出力されないのfalse trueですか?

4

3 に答える 3

13

参照は const ではないため、参照している型が const です。そうです、const参照はありません。したがって、参照がポインターであると想像してください。そうすれば、違いが理解しやすくなります。つまり、int const*const ではなく、int *constconst です。

remove_reference を使用して、実際の const 型を取得します。

cout << boost::is_const<
            boost::remove_reference<int const&>::type>::value << '\n';
于 2011-01-13T18:40:46.193 に答える
6

参照は ではないためconstです。:)

ref-to-constがあります (int const*ポインティング先intにはconstコンテキストがありますが、ポインター自体にはありません)。標準では用語が混同されていますが、誤解を招きやすい「const ref」という用語は使用しません。

参照は、初期化してから再バインドすることしかできないため、本質的に不変ですが、それによってconst.

boost::remove_reference(他の回答に示されているように)タイプから参照を削除できます。

于 2011-01-13T18:58:51.377 に答える
4

is_const<int const&>::valueさて、それも同様に誤りであることに気付きましたか? です。このようなテンプレートをデバッグするには、まずこのようなものを試す必要があります。もう 1 つ利用できるのは、活字プリンターです。

template < typename T > struct print;

それをインスタンス化すると、ほとんどの実装で、エラー出力に T が何であれ取得されます。

現在の問題を解決するには、これを試してください。

is_const< remove_reference< traits<int const>::reference >::type >::value

于 2011-01-13T18:46:55.420 に答える