我放弃了...
$5.2.7/2- "如果T是一个指针类型,v应该是一个指向完整类类型的rvalue指针,并且结果是类型为T的rvalue。如果T是引用类型,则v应该是完整类类型的lvalue,结果是T所引用的类型的lvalue。"
根据上述规定,以下代码应该是良好的形式。
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 规定,否则 v 必须是指向多态类型的指针或左值。所以我的问题是 $5.2.7/2 是什么意思?为什么这里会用到 $5.2.7/6 规定?