2014-09-25 95 views
-3

这是C和C++之间边界层上的一行函数。该函数获得一堆void* 并将它们转换为它们应该的类型。发现错误:为什么我能够默认构造一个没有默认构造函数的对象?

MDLPeriph periph_dline = *static_cast<MDLPeriph*>(dline_periph); 

确实,periph_dline应该是一个参考。令我感到困惑的是这段代码编译时没有警告。此外,检查此代码时,gdb报告Internal GDB error.并崩溃。

据我所知,上面的代码默认构造一个MDLPeriph对象。然后是使用新对象的拷贝构造函数从右侧分配值。

但MDLPeriph没有默认的构造函数!这怎么可能?

平台和工具:

Windown 7
yagarto的此版本使用以下版本:

的binutils:2.23.1 GCC:4.7.2 newlib:1.20.0 GDB:7.5。 1

(2012年12月22日,MIFI)OpenOCD的o.7.0

+2

这是一个直接复制结构。没有默认的建设。 @Andreas不,类可以没有默认的构造函数。只有当类没有任何用户声明的构造函数时,才默认构造函数被隐式声明。 – 2014-09-25 13:40:09

+2

@Andreas:不,一个类不一定有默认的构造函数。例如查看您链接到的问题的答案。 – sth 2014-09-25 13:42:20

+0

哦,该死的,是的,错过了当有**任何其他构造函数可用时,将不会生成默认构造函数...... – 2014-09-25 13:44:53

回答

5

没有什么在这里被默认构造。

指针强制转换会导致任何dline_periph指向被解释为MDLPeriph对象,而不会创建新对象;然后用它复制 - 使用它的拷贝构造函数初始化periph_dline

+0

因此,一个新对象仍在构建中,但其成员的任务是在施工? – Vorac 2014-09-25 14:25:38

+0

@Vorac:'periph_dline'是一个新的对象,使用它的拷贝构造函数初始化(除非它被定义为做一些奇怪的事情,它会复制每个成员的初始化)。 – 2014-09-25 14:38:06

相关问题