3

疑問に思っていたのは、ポインターではない void データ型が存在できないのはなぜですか?

確かに、決定されたサイズ全体を乗り越えることができます

void4
void8
void32

そして、そのサイズがクラスのサイズ以下である場合にのみ、void データ型を別のクラスに「キャスト」することが許可されます。

私が見逃しているものはありますか、それとも 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
}

void ポインターと同様に、現在格納されている型がわからないため、void という名前が付けられています。

4

10 に答える 10

8

これは、boost::variant または boost::any と呼ばれます。これは、許容される最大データ型 + sizeof(pointer) のサイズであり、完全にタイプ セーフです。

于 2010-08-25T12:03:58.837 に答える
3

強く型付けされた言語では、すべてのデータに型があるため、データ型としての「void」の概念はありません。CおよびC++では、その意味は「データなし」(戻り値として)または「タイプがわからないデータ」(ポインターターゲットとして)のいずれかです。

あなたは、おそらく値を渡すタイプの不透明なバージョンとして、「タイプはわからないがサイズは知っているデータ」の中間状態を提案しています。やや危険なことであることに加えて(実際の型のサイズを変更するときに不透明(OPAQUE)型を使用してすべてのコードを手動で更新する必要があるため)、これは言語に奇妙な拡張機能を追加せずにすでに実行できます。

struct void8 { char bytes[8]; };

これは、PODタイプを不透明な塊として渡すために、あなたが提案する方法と組み合わせて使用​​できます。非PODタイプで使用すると、非PODタイプを参照するためにreinterpret_cast使用するよりも、未定義の動作が発生する可能性が高くなります。void*

不透明(OPAQUE)型を、宣言されているが定義されていない名前付き型へのポインターまたは参照として処理する方が安全で慣用boost::any的です。値のセマンティクスが必要な場合などです。C++でプレースホルダータイプとして「void」を使用する必要はめったにありません。

于 2010-08-25T11:55:03.430 に答える
2

あなたが探しているものはすでに存在しています。それはと呼ばれcharます。aは基本的にC++のバイト名であるため、の配列をchar使用して未知のオブジェクトをに格納できます。charしたがって、未知のタイプまたは可変タイプのオブジェクトを単一の配列に格納するには、何もない配列ではなく、バイトの配列を使用しvoidます。

voidポインタのポイントは、それが何を指しているのかわからないということです。それが指しているオブジェクトのサイズもわかりません。したがって、avoid4はあまり意味がありません。オブジェクトのサイズがわかっていれば、「ボイド」ではなくなります。未知のオブジェクトでできることは、それを指すことだけです。それがPODオブジェクトであるかどうか、またその大きさや配置要件がわからないため、どこにも保存できません。したがって、それを配列に格納することはありません。私たちにできることはそれへのポインタを作成することだけであり、私たちはすでにそのためのvoidポインタを持っています。

そしてもちろん、楽しい小さな質問:

ここのタイプTは何ですか?

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

void4void32?それともただvoid?オブジェクトの大きさはどれくらいですか?私たちはそれについて何を知っていますか?PODタイプですか?

于 2010-08-25T11:56:01.800 に答える
2

「void」データ型の意味は何ですか? 有効なものはないと思うので、おそらく存在しないのです。

于 2010-08-25T11:39:00.603 に答える
2

ボイドとは?それは何もない、空虚です。Void32、笑!void は、何も返さない関数を指定するために使用されます。他の言語では、'procedure' または 'sub' というキーワードがあります。void へのポインターは不明へのポインターです (void の 2 番目の使用法)。それが無効なサーブの 2 つの目的です。

Update: I think, author wants to designate unknown type with known size. void32* is pointer to some entity with sizeof 32 bits, void8* is pointer to 8-bit entities and so on. But it's easily emulated with int32*, char* without language extension.

于 2010-08-25T11:39:35.027 に答える
0

サイズだけでなく、保管するものについてもう少し知っていると思います。そうでなければ、それらのアイテムを保管する意味はあまりないと思います。

組合を見てみたいと思います。ユニオンは、ユニオンの最大メンバーを保持するのに十分なスペースを予約し、ユニオンの参照方法に応じて、「適切な」スペースを選択し、要求するタイプとしてそれを提供します。

とは言うものの、実際に探しているタイプに文字の配列をキャストするのと同じように、この種の機能を使用する前によく考える必要があります。

于 2010-08-25T12:13:12.677 に答える
0

void データ型があった場合、それは何も表現せず、格納されているものをすべて飲み込むべきだと思います。

あなたが言うことができます

(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);

式で void を使用するとエラーになります

いくつかのテンプレートコーディングでこれを使用することができます。

于 2010-08-25T12:26:05.517 に答える
0

void データ型を持つと、不必要に複雑になります。さらに、それが void と呼ばれる場合、データ型は何をしているでしょうか。

void のように機能する可能性のあるデータ型を参照していると思いますが、名前を変更して void とは呼ばないでください。

于 2010-08-25T11:42:20.397 に答える
0

voidは「無人」型です。つまり、 type の可能な値がないことを意味しますvoid。可能な値がないため、 を格納するためのスペースは必要ありませんvoid。したがって、サイズのvoid値は無意味です。

少し戻って: C と C++ はかなり一貫してvoid「無」を意味するものとして認識します。何もないポインターを持つことができ、それを使用してポインターの値を何かに運ぶことができますが、それを逆参照することはvoidできません。何でもできる値はありません。

-is-nothing は void ポインターの場合にも適用されることにも注意してくださいvoid。GNU などの一部のコンパイラでは、値が であるかのvoid*ように値に対してポインター演算を行うことができますが、char*標準ではポインター演算が禁止されています。意味のないサイズ。void*void

ですから、答えは無意味だと思います。 void値には何も格納できません。

于 2010-08-25T12:08:42.633 に答える
0

void*無効のように無効なポインターではありません。そこには何もないので、それはボイドのポインターです。

タイプ タイプvoid自体は、値の欠如によって定義されます。その表現にビットはありません。物体を形成することはできません。

あなたが説明しているものは、キャストすることができます。したがって、情報が含まれています。したがって、それは空のボイドではありません。

あなたが説明しているのは、単にint数値が無視される場所です。しかし、提案された使用法は貧弱な方法です。

于 2010-08-25T12:04:23.920 に答える