c – dynamic_cast混淆

我放弃了这个…

$5.2.7/2- “If T is a pointer type,v
shall be an rvalue of a pointer to
complete class type,and the result is
an rvalue of type T. If T is a
reference type,v shall be an lvalue
of a complete class type,and the
result is an lvalue of the type
referred to by T.”

按照上述规定,以下代码应形成良好.

struct A{};
struct B : A{};

int main(){
   B b;
   A a,&ar1 = b;

   B& rb1 = dynamic_cast<B&>(ar1);  // Does not $5.2.7/2 apply here?
   B& rb2 = dynamic_cast<B&>(a);    // and also here?
}

但它不是.所有编译器都抱怨操作数到dynamic_cast不符合多态

$5.2.7/6- Otherwise,v shall be a
pointer to or an lvalue of a
polymorphic type (10.3).

所以我的问题是$5.2.7 / 2是什么意思?为什么$5.2.7 / 6踢在这里

解决方法

“否则”在这种情况下是指“除非适用5.2.7 / 5中的条件”.

您可以告诉这一点,因为/ 2对于关于dynamic_cast的操作数的程序要求(注意“v应该是一个左值”的“应该”语言与“是”的语言“结果是一个左值” ).与标准中的其他地方一样,表达要求并不一定意味着这是唯一的要求.其他条款可以规定额外要求.在这种情况下,/ 6表示一个额外的要求,只适用于某些情况,取决于T和v的静态类型.

/ 3,/ 4,/ 5告诉你结果的价值,它们完全符合/ 2中的要求.没有人以“否则”开头.所以对我来说,很明显,他们不会从/ 2开始形成一个“else if”链.

一些方括号或某些东西可能会更清楚(即/ / 6中的“否”适用于/ 5中的“if”,而不适用于/ 2,/ 3或/ 4中的“if”.但这不是房子的风格.

除了别的以外,/ 5中的“否定”在逻辑上不能有意义地适用于/ 2中的条件. / 1表示T必须是“指针或引用完整类类型,或cv void *”. / 2涵盖两种情况 – 指针类型和引用类型.那就是一切对/ 2没有“其他”(除非是说“否则,一致的编译器必须发出诊断”,而是隐含的)

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...