动态转换是否需要目标类型?
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
声明可以更好地避免重复 - 在许多相同的情况下。
查看以下表达式:
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
声明可以更好地避免重复 - 在许多相同的情况下。