what does the presence of & mean in const_cast template parameter
我正在看下面的例子
1 2 3
| const int a = 12;
int b;
b = const_cast<int&>(a); |
我想知道模板参数类型中的&在上面表示什么,以及为什么没有&不能起作用?
更新:
让我改一下我的问题。 我了解它的引用,但是它指的是什么变量? 例如,在这里它指出在指针的情况下它引用了原始(未广播)指针。 我想知道在非指针类型的情况下它所引用的内容以及b在未被声明为引用的情况下如何引用?
-
如果您不认识参考文献,则可能应该退后一步,阅读一本好的初学者C ++教程。
-
它的意义是……等等……一个参考!
-
让我改一下我的问题。 我知道它是一个参考,但是它指的是什么变量? 例如,在msdn.microsoft.com/zh-cn/library/bz6at95h%28v=vs.110%29.aspx中,它指出在指针为万一的情况下它引用了原始(未广播)指针。 我想知道在非指针类型的情况下它引用了什么
-
它没有引用任何变量。 它仅指示类型。
const_cast不是模板,而是类型转换。 看起来是模板参数的是强制转换的目标类型,在这种情况下,这意味着您要获取对int的非常量引用,该引用与a引用相同的对象。
-
所以目标类型是引用,那么我正确吗?如果是这样,它的引用是什么?是在内存中创建一个临时对象吗?我用指针尝试过此操作,并且msdn.microsoft.com/zh-cn/library/bz6at95h%28v=vs.110%29.aspx指出它引用了原始(未广播)指针。我想知道在没有指针的情况下会发生什么
-
@MistyD:它引用作为强制转换参数的对象。
-
我仍然对在声明为int b而不是int &b时如何引用某些内容感到困惑
-
@MistyD:强制转换生成一个非常量引用,该引用用于将值复制到b。 b不是对a的引用,而是一个保存a副本的int变量。该代码在该代码中是不必要的(甚至令人困惑)
-
谢谢你的解释。我只是想确保涉及复制
编写const_cast时,a是const int&。
您只能使用const_cast修改指针和引用类型的cv限定词,而不能修改值。 这是因为仅当值是引用或指针类型并且可以进行修改时,才为rvalue指定常量性。
因此,如果您只想要变量a的(非常量)值,只需编写
因为无论如何都会忽略常量性。 然后从a复制b。
-
常量是否会忽略值?您可能需要进一步解释您的意思,因为这是错误的
-
@ DavidRodrguez-dribeas我将其更正为" rvalues",这现在正确吗?我的意思是,当我在表达式中使用const值(rvalue?)时,它的常数无关紧要。仅当我尝试分配给它时(左值?)。但是也许我不知道正确的术语。
-
在您写的a is const int&第一行中,您可以解释一下这是什么意思吗?因为我的代码有const int
-
我的意思是:ideone.com/ORASWu我想说的是:const原语类型的变量一旦成为表达式的一部分,它的int,const int&,const int或int&都不会。修改表达式的结果没有任何意义,因此没有理由说表达式是const。但是,如果考虑用户定义的类型,这当然可以有所不同。
-
我试图重新表达我想说的内容,请参见我的编辑。我觉得很难表达这一点;)
-
@leemes:您将范围限制为基本类型,但在不加限定的情况下空白声明。即使对于右值,恒定性也很重要,而对于基本类型的右值则不重要。考虑struct T { void mutate(); }; const T f(); f().mutate();。表达式f()是类型为const T的右值表达式,const很重要,并且不允许在其上调用mutate()。将返回类型更改为T f();,以上代码将编译。
-
...我知道您想去哪里,但措辞有误。据我了解,您的意图是说舍弃副本的常数性是没有意义的,但是您想从引用原始对象的指针或引用中舍弃const。复制后,您可以使复制成为非常量,并且不需要const_cast。
-
好吧,但是a+1并非副本afaik。它是一个新值,一个临时值,一个右值,...我不知道如何更好地描述它以区别于a本身。除非operator+做奇怪的事情,否则a+1不会引用存在于临时表达式之外的现有值(例如,在变量中;例如,您将其称为"原始对象"),因此,修改它。这些话现在当然再模糊了。
基本上a是const,b不是const
因此const_cast基本上说b存储在a处,但删除了const。