在C ++中,void和其他不完整类型之间的主要区别是什么?

时间:2014-11-22 17:03:15

标签: c++ types void incomplete-type

我是整体编程的新手。

我已经尝试阅读该语言的官方标准,但找不到我的问题的任何答案。

所以我需要了解在C ++中void类型和其他不完整类型之间的主要区别。例如:语言(或代码)中是否存在可以使用void而不是其他不完整类型的位置,反之亦然?或者在各方面都像其他不完整类型一样无效?

1 个答案:

答案 0 :(得分:8)

虚空和另一种不完整的类型之间确实有一个非常微妙的区别:

您无法引用void类型:

struct T;       // incompletely defined type 
                // incompletely defined types and void are incomplete types
T* x=nullptr;   // pointer to incomplete type are valid, same for void pointers
T& tref=*x;     // it's valid to have a reference to an incompletely defined type 
void& vref;     // it's INVALID to have a reference to void, because no object could ever be void

 int f(void &vt);   // INVALID function declaration with invalid parameter: void reference 
 int g(T& vt);      // valid function declaration using a parameter: reference to incomplete type

C ++标准报价:

  

3.9 / 5:已声明但未定义的类,或未知大小或元素类型不完整的数组,是   未完全定义的对象类型。未完全定义的对象类型   而void类型是不完整的类型

     

3.9 / 8:对象类型是(可能是cv限定的)类型,它不是函数类型,不是引用类型,也不是void类型。

     

8.3.2 / 1:指定“对cv void的引用”类型的声明符格式不正确。

可以将任何表达式转换为void,这显然不是其他不完整类型的情况:

(void)(3 + 5);    // OK explicit conversion to void
(T)(3 + 5);       // Invalid expression to an incomplete type

这在C ++标准中有记载:

  

3.9.1 / 9:任何表达式都可以显式转换为cv void