C++ C++;无效非指针

C++ C++;无效非指针,c++,types,void,casting,C++,Types,Void,Casting,我想知道,为什么不能有一个不是指针的空数据类型 当然,你可以通过 void4 void8 void32 然后,只有当一个空数据类型的大小等于或小于类的大小时,才允许将其“强制转换”到另一个类 P>是否有什么我错过了,还是C++委员会认为它是坏的实践? 编辑: 我没有很好地解释我自己,所以我将举一个使用它的例子: main() { /* Lets make a list of unknown elements std::string is 8 bytes,

我想知道,为什么不能有一个不是指针的空数据类型

当然,你可以通过

void4
void8
void32
然后,只有当一个空数据类型的大小等于或小于类的大小时,才允许将其“强制转换”到另一个类

<> P>是否有什么我错过了,还是C++委员会认为它是坏的实践? 编辑:

我没有很好地解释我自己,所以我将举一个使用它的例子:

 main()
{
    /* 

     Lets make a list of unknown elements

     std::string is 8 bytes, and float is 4
     bytes, so we'll reserve 8 byte sequences

     */

    vector<void8> elements;

    elements.push_back((void8) string("First string element"));

    elements.push_back((void8) float(5.76) );

    elements.push_back((void8) string("Third string element"));

    // Ect.

    cout << (string) elements[0];
    cout << (float) elements[1];
    cout << (string) elements[2];
    cout << (float) elements[2]; // Garbage


    void1 data;

    data = (void1) bool(1);
    data = (void1) unsigned int(80094); // Error, not enough size
}
main()
{
/* 
让我们列一个未知元素的列表
string是8字节,float是4字节
字节,因此我们将保留8字节序列
*/
矢量元素;
元素。推回((void8)字符串(“第一个字符串元素”);
元素。推回((8)浮动(5.76));
元素。推回((void8)字符串(“第三个字符串元素”);
//Ect。

“void”数据类型的含义是什么?我认为没有一个有效的数据类型,所以这可能就是它不存在的原因。

什么是void?它什么都不是,空虚。Void32,哈哈! void用于指定不返回任何内容的函数。在其他语言中有关键字“procedure”或“sub”。指向void的指针是指向unknown的指针(第二次使用void)。这是void的两个用途


更新:我认为,作者希望指定大小已知的未知类型。void32*是指向大小为32位的实体的指针,void8*是指向8位实体的指针,等等。但是它很容易用int32*、char*进行模拟,而无需语言扩展。

拥有一个void数据类型将不必要地使事情复杂化。此外,dat将如何处理如果一个类型被称为void,那么它将被执行


我猜你指的是一个数据类型,它可能像一个空的函数,但是你可能想改变它的名字而不是叫它无效。

< P>在一个强类型的语言中,所有的数据都有一个类型,所以没有“空虚”的概念作为数据类型。在C和C++中,它的意思是“没有数据”(作为返回值),或者“不知道类型的数据”。(作为指针目标)

您建议中间状态为“您不知道其类型但知道其大小的数据”,这可能是通过值传递的类型的不透明版本。此外,这是一件相当危险的事情(因为在更改实际类型的大小时,您必须使用不透明类型手动更新所有代码),这已经可以在不向语言添加奇怪扩展的情况下完成,例如:

struct void8 { char bytes[8]; };
这可以与
reinterpret_cast
结合使用,以您建议的方式将POD类型作为不透明块传递。与使用
void*
引用非POD类型相比,将其用于非POD类型更可能调用未定义的行为


将不透明类型作为指向已声明但未定义的命名类型的指针或引用,或者类似于
boost::any
,如果您需要值语义,则将更安全、更惯用。很少需要使用“void”作为C++中的占位符类型, > p>您所寻找的已经存在。它被称为“代码> char < /Cord>。一个数组<代码> char < /C>可以用来存储未知的对象,因为 char 基本上是C++的字节。因此,将未知或可变类型的对象存储到一个数组中,您使用的是字节数组,而不是一个字节。空数组,它将是空的

void
指针的要点是我们不知道它指向什么。我们也不知道它指向的对象的大小。因此
void4
没有多大意义。它不再是“void”如果我们知道对象的大小。我们可以对未知对象做的唯一事情就是指向它。我们不能将它存储在任何地方,因为我们不知道它是否是一个POD对象,也不知道它有多大,或者它的对齐要求。所以我们当然不会将它存储到数组中。我们所能做的就是创建一个指向它的指针,我们已经有了
void
这方面的指针

当然,还有一个有趣的小问题:

这里的T型是什么

void foo(void* p) {
   T q = *p;
}

void4
void32
?或者只是
void
?对象应该有多大?我们对它了解多少?它是POD类型吗?

它被称为boost::variant或boost::any。它是允许的最大数据类型的大小+sizeof(指针)并且是完全类型安全的。

void*
不是一个void指针,就像在invalid中一样。它是指向一个void的指针,就像在invalid中什么都没有一样

类型Type
void
本身是由缺少值定义的。它的表示中没有位。它不能形成对象

您所描述的内容可以被转换为和转换为。因此,它包含信息。因此,它不是一个空白

您所描述的只是一个忽略了数值的
int
。但是建议的用法是不实用的。

void
是一个“无人居住的”类型,表示没有类型为
void
的可能值。由于没有可能值,因此存储
void
不需要空间。因此,大小为
void
的值将毫无意义

退一步:C和C++相当一致地认识到<代码>空洞意思是“没有”。你可以有一个指针,什么也没有,用它来携带指向某个事物的指针的值,但是你不能去引用它。<代码> Value没有任何价值,你可以做任何事情。

还要注意的是,
void
-是空指针:虽然GNU等一些编译器允许您对
void*
值进行指针运算,就像它们是
char*
一样,但标准禁止对
void*
进行指针运算,因为
void
是空的,所以它没有m有意义的大小

所以,我认为答案是:这将是毫无意义的。
void
什么都不是,你不能在值中存储任何东西。

我假设你是k
(void)func1();
void x;
x = func1();
void func2() {
   void x;
   ...
   return x;
}
int func3(int x, void y, char z);

void x = func3(1,2);
x = func3(1,x,2);