顶级或低级常量或两者都不?

时间:2015-12-29 21:28:47

标签: c++ c++11 const

我正在完成C++ Primer并且如果我理解正确的话:

  • 顶级常量适用于对象本身。
  • 低级别constness意味着引用的对象是const,它使引用的对象成为顶级const。
// A plain int.
int i {0};

// Top-level const ints.
const int ci {42};
const int ci2 {0};

// A low-level pointer to const int.
const int * pci {&ci};

// Low-level, because the referenced object can't be changed.
*pci = 0; // error

// But not top-level, because it can be changed to point to another object.
pci = &ci2; // fine

// This is both top-level and low-level const
// because both the pointer and the object it
// points to are const:
const int * const cpci {&ci};
*cpci = 0;   // error
cpci = &ci2; // error

现在的问题。 是否有一个constness的命名约定既不是顶级也不是低级? I.e。指针本身不是const,但它以不变的方式指向非const对象?或者这是低级别常量的特例?例如:

int i {0];
int j {42};

// The following pointer is not const itself.
// The object it's pointing to is not const but
// it can't be manipulated through the pointer.
const int * pci {&i};
*pci = 42; // error

// All these are fine:
++i;
pci = &j;
++j;

*pci = 42; // error as above

在接受Orbit的轻盈竞赛后编辑回答:
我的IDE称它们为只读指针,这对我来说很有意义 虽然引用的对象可以通过这个丑陋的演员来改变:

*const_cast<int*>(pci) = 21;

1 个答案:

答案 0 :(得分:3)

不,不是真的。

您所做的区别在于具有const限定类型的对象和带有const表达式之间 - 合格类型。

因为(从使用的角度来看)很少有人讨论哪个人在玩,在任何特定情况下都没有有意义的术语来区分它们。

这确实使得解释为什么以下程序完全有效且定义明确(如果确实非常糟糕的风格),尽管丢弃了const

void foo(const int& x)
{
   // the expression `x` has type `const int&` (before decay),
   // but after casting away the constness we can modify the
   // referent, because it happens to actually be non-`const`.
   const_cast<int&>(x) = 66;
}

int main()
{
   int x = 42;    // object is not const!
   foo(x);
}

虽然"top-level const" is standard terminology虽然值得,但我对你的&#34;低级const&#34;不太确定。这些术语甚至不是对称的! Pfft。

在上面的foo()中,我们实际上不会写const_cast,因为我们假设所有输入都是对真正const的对象的引用{1}}。