C++ 使用动态\u转换指针时抛出错误的\u转换?

C++ 使用动态\u转换指针时抛出错误的\u转换?,c++,pointers,casting,reference,C++,Pointers,Casting,Reference,动态\u cast抛出错误\u cast异常,如果您抛出引用,但正如我所知,在标准中指针被视为引用,即指针是引用的一种类型。 所以当我投射指针时,我应该得到坏的投射吗 这个问题源于来自的try-catch块。此try-catch块不合适吗?如果使用指针,则在错误转换的情况下,dynamic\u cast将返回一个null 另外,dynamic_cast仅适用于多态类,因此如果您谈论的是内置数据类型(从问题中的链接),那么您应该使用static_cast 顺便说一句,引用是而不是指针。如果指针转换

动态\u cast抛出
错误\u cast
异常,如果您抛出引用,但正如我所知,在标准中指针被视为引用,即指针是引用的一种类型。
所以当我投射指针时,我应该得到坏的投射吗


这个问题源于来自的try-catch块。此try-catch块不合适吗?

如果使用指针,则在错误转换的情况下,
dynamic\u cast
将返回一个
null

另外,dynamic_cast仅适用于多态类,因此如果您谈论的是内置数据类型(从问题中的链接),那么您应该使用
static_cast


顺便说一句,引用是而不是指针。

如果指针转换错误,则
动态转换将返回
空值
另外,dynamic_cast仅适用于多态类,因此如果您谈论的是内置数据类型(从问题中的链接),那么您应该使用
static_cast


顺便说一句,参考文献是而不是指针。

关于最初的问题“那么我在投射指针时是否应该得到坏的投射?”,没有

这就是为什么你可以看到这样的结构

if( T* pT = dynamic_cast<T*>( p ) ) ...  // use pT in if body
if(T*pT=dynamic_cast(p))…//在if体中使用pT
关于新问题“这个try-catch块不合适吗?”,不,它是一个
try
-
catch
块,用于捕获分配错误;它与
动态\u cast
本身无关


干杯,嗯。

关于最初的问题“那么我在投指南针时是否应该投坏球?”,没有

这就是为什么你可以看到这样的结构

if( T* pT = dynamic_cast<T*>( p ) ) ...  // use pT in if body
if(T*pT=dynamic_cast(p))…//在if体中使用pT
关于新问题“这个try-catch块不合适吗?”,不,它是一个
try
-
catch
块,用于捕获分配错误;它与
动态\u cast
本身无关

干杯,

因为
动态\u cast
不会抛出异常,所以其中一个try-catch块是完全不必要的

不过,您可以轻松定义自己的强制转换函数,该函数确实会为指针引发异常。这就是我在自己的代码中所做的(简化代码,请注意,我使用垃圾收集,这样我就可以毫无后果地抛出指针):

模板
内联类*cast(对象*obj)
{
等级*结果=动态施法(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
模板
内联常量类*强制转换(常量对象*对象)
{
常量类*结果=动态投影(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
另一方面,我还将其用作静态_cast的语法糖,但这只是因为我不将其用于动态_cast引用和常量引用:

template <class Class, class Object>
inline Class cast (const Object& obj)
{
    return static_cast<Class>(obj);
}
模板
内联类转换(常量对象和对象)
{
返回静态_-cast(obj);
}
我想说的是,您最好实现自己的强制转换功能,该功能在异常处理方面是一致的,并且可以精确地执行您想要和期望的操作。我这样做了,但从来没有回头看。

因为
动态\u cast
不会抛出异常,所以其中一个try-catch块完全没有必要

不过,您可以轻松定义自己的强制转换函数,该函数确实会为指针引发异常。这就是我在自己的代码中所做的(简化代码,请注意,我使用垃圾收集,这样我就可以毫无后果地抛出指针):

模板
内联类*cast(对象*obj)
{
等级*结果=动态施法(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
模板
内联常量类*强制转换(常量对象*对象)
{
常量类*结果=动态投影(obj);
if(obj!=null,result==null){
抛出新的ClassCastException();//不寻常,如果愿意,抛出坏类型
}
返回结果;
}
另一方面,我还将其用作静态_cast的语法糖,但这只是因为我不将其用于动态_cast引用和常量引用:

template <class Class, class Object>
inline Class cast (const Object& obj)
{
    return static_cast<Class>(obj);
}
模板
内联类转换(常量对象和对象)
{
返回静态_-cast(obj);
}

我想说的是,您最好实现自己的强制转换功能,该功能在异常处理方面是一致的,并且可以精确地执行您想要和期望的操作。我这样做了,从来没有回头看。

我不是说引用是指针,我是说指针是引用的一种类型。那真的是不同的事情!无指针不是一种引用类型,它们都是不同的things@Narek在C++术语中,“引用”用于引用。我同意这是一个非常尴尬的术语。但为了避免误解,我们需要非常小心地保持舌头笔直(或者不管英语中的惯用表达是什么!):-)如果它在指针转换过程中没有抛出,那么为什么链接中有try-cats块?这不合适吗?@Narek:如果你注意到了,链接中的代码在每次
动态\u cast
后都会检查null。那里的
try-catch
将捕获从
new
引发的
bad\u-alloc
异常,但即使是
try-catch
也不适合这样做。是的,这是一个糟糕的例子。我不是说引用是指针,我说指针是引用的一种类型。那真的是不同的事情!无指针不是一种引用类型,它们都是不同的things@Narek在C++术语中,“引用”用于引用。我同意这是一个非常尴尬的术语。但为了避免误解,我们需要非常小心地保持舌头笔直(或者不管英语中的惯用表达是什么!):-)如果有