dynamic_cast const ref 到 const ref. cppReference.com 的解释似乎很奇怪
dynamic_cast a non-const ref to a const ref. cppreference.com's explanation seems odd
我正在刷新我对各种类型的选角的记忆,并在cppreference.com上发现了以下内容(http://en.cppreference.com/w/cpp/language/dynamic_cast):
1)如果表达式的类型正是new_type的new_type或不太符合cv的版本,则结果为表达
参考结构
dynamic_cast < new_type > ( expression )
我将其解释为,例如,尝试将一个非常量引用的dynamic_cast转换为同一类型的常量引用,实际上会产生非常量引用,因此允许我调用其非常量成员,这与我所期望的相反。我写了下面的一段代码来验证这一点:
#include<iostream>
class Base
{
int value;
public:
Base():value(0){};
virtual void ShowVal() const
{
printf("Value is %dn", value);
}
virtual void SetVal(int val)
{
value = val;
}
};
int main ()
{
Base b;
Base& rB = b;
b.ShowVal();
(dynamic_cast<const Base&>(rB)).SetVal(2); //fails where (dynamic_cast<Base&>(rB)).SetVal(2); is obviously fine.
b.ShowVal();
}
正如我所预料的那样,这个没有编译,我得到了错误
blah.cpp:28:3: error: member function 'SetVal' not viable: 'this' argument has type 'const Base', but function is not marked const
(dynamic_cast<const Base&>(rB)).SetVal(2);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我想我要问的问题是:我误解了上面的规则吗?如果是这样的话,实际上在说什么?有没有类似的基本例子可以证明这一点?
谢谢。(在此期间,我将再次阅读,如果我意识到我误读了它,那么我会迅速删除这个问题,并开始掌纹…)
从编写的方式来看,这并不明显,但转换仍然会发生。这只是意味着从转换中获得的对象(指针或引用)与expression
表示的对象相同。不过,强制转换表达式是const
类型的,因为这就是您将其转换为的类型。
以下是它在C++11标准中的样子:
如果
v
的类型与T
相同,或者与T
相同,只是T
中的类对象类型比v
中的类目标类型更具cv限定性,则结果为v
(必要时转换)。
请注意"converted if necessary"。
你可能会想,为什么说结果是expression
会很麻烦?对于大多数dynamic_cast
s,结果是而不是expression
。考虑将指向基类的指针强制转换为指向派生类的指针。你不会从中得到相同的指针。相反,你会得到一个指向派生子对象的指针。
它说表达式的类型可以是比新更少cv合格。结果的类型仍然是new(值为表达式)。因为这是指定的。
- 将 ArrayXd 传递给 const VectorXd& 和 const Ref<const VectorXd>&
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 正在通过const-ref未定义的行为捕获新构造的对象
- 将文字作为const-ref参数传递
- "move"和"const ref&"如何使双丁吉过载起作用?
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 为什么在CTOR工作中将温度变量传递到const Ref中
- 使用 const ref 参数进行自赋值的行为
- 是否不允许编译器假设 const-ref 参数将保持 const?
- 如何在不允许临时创建的情况下编写 const ref
- 使用const_cast const-ref getter 实现引用获取器的陷阱
- 重载分辨率:调整 const/ref 是否不比用户定义的转换更好?
- const Ref与RVALUE内部资源结合
- 使用std :: async时,为什么通过const ref速度较慢
- 为什么转换运算符在存在 const-ref 和值时会导致不明确的重载
- 如何避免将const-ref返回缓存中的临时性
- dynamic_cast const ref 到 const ref. cppReference.com 的解释似乎很奇怪
- 为什么"const Eigen::Matrix<>&"和"const Ref<Eigen::Matrix<> >"显然不兼容?