动态转换是否需要目标类型?

Is target type necessary in dynamic casting?

查看以下表达式:

Target * p = dynamic_cast<Target*>(pFarAncestor);

是否存在动态转换类型可能与左值(在本例中为 p)类型不同的情况?换句话说,始终明确目标变量的类型是有原因的?

我想知道为什么编译器不接受像这样的缩略形式:

Target * p = dynamic_cast<>(pFarAncestor);

甚至

Target * p = dynamic_cast(pFarAncestor); // ok this seems a function call indeed

引入auto关键字主要是因为这个原因:

auto p = dynamic_cast<Target*>(pFarAncestor);

如果你真的想避免重复表达式右侧的类型,你可以使用 decltype,但它有点冗长:

Target * p = dynamic_cast<decltype(p)>(pFarAncestor);

但是你显然必须至少在某处写一次类型。

要回答 "Is there a case where the dynamic conversion type could differ from the left value (p in this case) type?" 可以构建许多示例,并且相当有用的一个是:

bool hasTargetAncestor = dynamic_cast<Target*>(pFarAncestor);

赋值是另一种情况:

shared_ptr<Target> p;
...
  p = dynamic_cast<Target*>(pFarAncestor);

正如已经指出的那样,使用 auto 声明可以更好地避免重复 - 在许多相同的情况下。