7

ポインターを非 としてstd::is_const識別する の動作に困惑しています。私自身の の実装は、まったく同じことを行います。より一般的なテンプレート化された構造体がバージョンよりも選ばれている理由はわかりません。gcc4.7 と clang3.1-svn はどちらも同じ動作を示します。誰が何が起こっているのか説明できますか? コードを以下に示します。constconstis_const<T><const T>

#include <iostream>
#include <sstream>
#include <type_traits>

class CEmptyClass {}; 

namespace jbc 
{
  template <typename T>
  struct is_const : std::false_type {}; 

  template <typename T>
  struct is_const<const T> : std::true_type {}; 
}

int main(int argc, char* argv[])
{
  std::cout << "Is 'const CEmptyClass*' constant according to std lib : " 
    << std::is_const<const CEmptyClass*>::value << std::endl;
  std::cout << "Is 'const CEmptyClass*' constant according to jbc : " 
    << jbc::is_const<const CEmptyClass*>::value << std::endl;
}

どちらの場合もis_const<const CEmptyClass*>::value戻ります0

4

1 に答える 1

19

参照のようなものはありません。const参照は決してありませんconst。次のようなコードはコンパイルされません。

int& const i;

参照を削除すると、うまくいきます。const右側に配置する場合(意味的には同じことです)、型を逆に読む場合

CEmptyClass const&

CEmptyClassへのconst参照はなくconst CEmptyClassへの参照を読み取ります。

更新:ポインターへの参照を変更したため、同じ誤解が残ります。

const CEmptyClass*
CEmptyClass const*

どちらも同じです。const CEmptyClass への非 constポインターです。

CEmptyClass* const

CEmptyClass へのconstポインターです。

const CEmptyClass* const
CEmptyClass const* const

const CEmptyClass への const ポインターです

于 2012-06-03T00:11:21.910 に答える