$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踢在这里?
解决方法
您可以告诉这一点,因为/ 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没有“其他”(除非是说“否则,一致的编译器必须发出诊断”,而是隐含的)