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中什么都没有一样
类型Typevoid
本身是由缺少值定义的。它的表示中没有位。它不能形成对象
您所描述的内容可以被转换为和转换为。因此,它包含信息。因此,它不是一个空白
您所描述的只是一个忽略了数值的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);