我正在完成C++ Primer并且如果我理解正确的话:
// 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;
答案 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}}。子>