C ++资格认证转换 - 常量和模板

时间:2011-04-25 04:39:00

标签: c++

在下面的代码中,我试图找出编译器(msdev c ++ 2010和Comeau)为什么不将非专用模板get函数的返回类型视为const的原因。我希望CASE#2(参见代码snipet)不能编译,但确实如此。任何想法或链接?

谢谢你,regu

template < typename T >
struct constness
{
  T value;
  constness() : value(0) {}
  const T &get() { return value; }
};

template < typename T >
struct constness< T * >
{
   T * const value;
   constness() : value(0) {}
   const T * const &get() { return value; }
};

int main( int argc, const char* argv[] )
{
  // Uses specialized
  constness< double * > wConstness;
  const_cast< double * & >(wConstness.value) = new double(1);
  *wConstness.get() = 12.0; // CASE #1 doesn't compile

  // Uses non specialized 
  constness< double * const > wConstness2;
  const_cast< double * & >(wConstness2.value) = new double(1);
  *wConstness2.get() = 12.0; // CASE #2 compiles, allowing modification of 
                             // value pointed by wConstness2.value

  return 0;
};

1 个答案:

答案 0 :(得分:3)

使用constness = T(一个指向非const限定double * const的const限定指针)实例化double

const T& get()中,const适用于整个T。如果Tint*,那么const T将是int* const,而不是const int*。因此,在您的特定情况下,const无效,因为T已经是const限定的(它是double* const)。

当您拥有类似T的类型名称时,在类型名称中添加constvolatile始终适用于顶级,无论类型是什么。因此,const TT const始终相同,无论T是什么。