2

Aconst_cast用于删除或添加对象的“常量”。
但是,这种演员的效果或行为是什么,不会改变“const-ness”?

换句话说,如果const_cast<Class&>(object)应用于object已经是非常量Class类型的对象会发生什么。
同样,如果const_cast<const Class&>(object)应用于object已经是const Class类型的 ,会发生什么。

虽然我觉得应该很好定义,但还是想确认一下。特别是如果标准中有任何权威参考或某些内容。

用例:在模板代码中,有时为了避免额外的代码,我们可能希望const_cast每个对象都出现。它可以与对象一起传递,也可以不与const对象一起传递const。例如

struct X {
  void foo ();
};

template<typename T>
void call_foo (T& t)  // `T` is either `X` or `const X` (& possibly children of `X`)
{
  X& x = const_cast<X&>(t);
  x.foo();
}

假设,暂时我们不担心说明volatile符。

4

2 回答 2

4

完全没问题。不会有任何影响——就好像你根本没有const_cast

请注意,您可以使用它std::is_const来检查特定类型是否为 const。但是,如果这样做的唯一原因是避免 no-op const_cast,我不会打扰。

于 2017-01-19T06:32:19.180 回答
1

如果一个对象不是const,使用const_cast<>to remove constness 没有区别。从逻辑上讲,从已经缺少该属性的事物中删除该属性没有任何作用。

例如,如果对象也是 volatile 的,则例外;

 volatile SomeType x;   // const qualifier may also be used here

 SomeType &something = const_cast<SomeType &>(x);

这也删除了volatile限定符,无论x是否const。任何使用访问的东西x都会导致未定义的行为。

如果此示例更改为类似

 SomeType y;
 volatile SomeType& x(y);
 SomeType &something = const_cast<SomeType &>(x);

然后 usingsomething是合法的(因为y不是 volatile),但如果x用于以y某种方式修改,编译器可能会或可能不会确保在something访问时反映这些更改(反之亦然)。如果(比如说)信号处理程序对x.

对于您的用例,使用const_cast. 重载一个函数很容易,所以它需要一个const或非const引用。

  void func(Something &x);
  void func(const Something &x);

如果给定一个const对象,第二个将被调用。使用const_castto remove constness 在第一个中没有效果。其次,它可能允许更改不可更改的内容,因此可能导致未定义的行为(如果const以这种方式使用非引用)。

于 2017-01-19T08:27:21.140 回答