C++ 限定转换 - 常量和模板

标签 c++

在下面的代码中,我试图弄清楚为什么编译器(msdev c++ 2010 和 Comeau)不​​将非专用模板 get 函数的返回类型视为 const。我希望 CASE #2(参见代码片段)无法编译,但它确实编译了。有什么想法或链接吗?

谢谢你,雷古

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;
};

最佳答案

您实例化constnessT =double * const (指向非 const 限定 double 的 const 限定指针)。

const T& get()const适用于整体T 。如果Tint* ,然后const T将是int* const ,不是const int* 。因此,在您的具体情况下,const没有效果,因为 T已经是 const 限定的(它是 double* const )。

当您的类型名称类似于 T 时,添加constvolatile无论类型是什么,类型名始终适用于顶层。所以,const TT const无论什么,总是相同的T是。

关于C++ 限定转换 - 常量和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5775208/

相关文章:

c++ - 使用 OMP 进行多个 Eigen::Matrix 初始化:段错误

c++ - 使用 getfile 跳过一行

c++ - 如何在boost regex_search中获取原始字符串前缀

c++ - 我想添加两个 String 类型的矩阵。用户不会输入行数或列数。用户只会输入数组

c++ - C++ 11中的合取类型特征

C++ 无法识别空格

c++ - 在 Eigen 中填充稀疏矩阵非常慢

c++ - C 和 C++ 中的快速 7x7 2D 中值滤波器

c++ - 扩展QMessageBox类时如何访问QMessageBoxPrivate中的label变量?

c++ - 使用递归获取变量的奇怪值