Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当“const”的变化时,“const”的作用是什么;const ness“;这不是必需的吗?_C++_Language Lawyer_Const Cast_Well Formed - Fatal编程技术网

C++ 当“const”的变化时,“const”的作用是什么;const ness“;这不是必需的吗?

C++ 当“const”的变化时,“const”的作用是什么;const ness“;这不是必需的吗?,c++,language-lawyer,const-cast,well-formed,C++,Language Lawyer,Const Cast,Well Formed,const\u cast用于删除或添加对象的“const”。 然而,这种演员的效果或行为是什么,它不会改变“常数” 换句话说,如果const\u cast(object)应用于一个已经是非constClass类型的对象,会发生什么情况。 类似地,如果将const_cast(object)应用于已属于const Class类型的对象,会发生什么情况 虽然我觉得应该有一个很好的定义,但还是想确认一下。特别是如果标准中有权威参考或其他内容 用例:在模板化的代码中,有时为了避免额外的代码,我们可能希望c

const\u cast
用于删除或添加对象的“const”。
然而,这种演员的效果或行为是什么,它不会改变“常数”

换句话说,如果
const\u cast(object)
应用于一个已经是非const
Class
类型的
对象,会发生什么情况。
类似地,如果将
const_cast(object)
应用于已属于
const Class
类型的
对象,会发生什么情况

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

用例:在模板化的代码中,有时为了避免额外的代码,我们可能希望
const_cast
每个对象都按自己的方式出现。它可以与
const
或非
const
对象一起传递。e、 g

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();
}
struct X{
void foo();
};
模板
void call_foo(T&T)/`T`是`X`或`const X`(&可能是`X`的子项)
{
X&X=常数(t);
x、 foo();
}

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

这很好。不会有任何效果——就好像你根本没有
const\u cast


请注意,您可以使用检查特定类型是否为const。但是,如果这样做的唯一原因是为了避免无操作
const\u cast
,我就不会麻烦了。

如果一个对象不是
const
,使用
const\u cast
删除
const
属性没有任何区别。从逻辑上讲,从已经缺少某个属性的事物中删除该属性不会产生任何效果

例外情况是,如果对象也是易变的,例如

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

 SomeType &something = const_cast<SomeType &>(x);
然后使用
something
是合法的(因为
y
不是易变的),但是如果
x
以某种方式用于修改
y
,编译器可能会也可能不会确保在访问
something
时反映这些更改(反之亦然)。如果(比如)一个信号处理程序对
x
做了一些事情,那么要验证代码是否按预期工作就相当困难了

对于您的用例,使用
const\u cast
是没有意义的。重载函数很容易,因此它需要一个
const
或非
const
引用

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

其中,如果给定
const
对象,将调用第二个。使用
const\u cast
删除
const
ness在第一个步骤中没有效果。在第二种情况下,它可能允许更改不可更改的内容,因此可能导致未定义的行为(如果以这种方式使用非
const
引用)。

如果
object
是易变的,则可能会出现问题?您可以使用
static\u cast
添加const,但是只有
const\u cast
可以删除它。对对象的非
const
引用的一个关键属性是它可以用来更改引用的对象。如果该对象已不是常量,则可以对其进行更改。因此,通过任何方式获得对它的非
const
引用都不会改变任何东西。
const\u cast
改变表达式的
const
-ness。无法更改对象的常量。“在模板化代码中,我们可能不知道传递的对象是否为常量类型”-实际上,您总是知道这部分有任何标准引用吗?@iammilind:关于什么,
int x;const_cast(x)
为您提供了一个
int&
?标准中的一个参考,该参考表示,如果对象或类型的“const”性质相同,则
const_cast
将不会产生任何操作或效果。就我个人而言,我觉得该标准可能不会提出这些琐碎的案例,但本Qn的主要目的是获得一些权威参考。@iammilind:如果您想要权威参考,我建议添加“语言律师”标签。(我会删除“casting”标记,可能还会删除“const”)标准确实指出
1+1==2
(通过涉及的运算符和文本的定义)在第一个示例中,使用
something
访问
x
将导致未定义的行为(非易失性表达式可能无法访问易失性对象)将示例设置为
sometypey;挥发性SomeType&x(y);SomeType&something=const_cast(x)这个例子就合法了。是的,好的。更新。
  void func(Something &x);
  void func(const Something &x);