2

私はこの質問をしました:ベアストリングと同等の配列

答えは C++ で、s に対してこの機能を提供していませんconst int*。これは残念です。したがって、私の質問は次のとおりです。実際には、この制限をどのように回避できますか?

次のような構造体を書きたいと思います。

struct foo{
    const char* letters = "abc";
    const int* numbers = ???
};

私はできません:

  1. &{1, 2, 3}r値のアドレスを取得できないため
  2. array<int, 3>{{1, 2, 3}}.data()初期化直後にメモリがクリーンアップされる原因
  3. const int* bar(){ return new int[3]{1, 2, 3}; }このポインターは何も削除されないため

自動ポインターを使用してこれを回避できることを知っています。私はそれstruct fooが良いコードであることを示唆しているわけではありません。コンパイラが const 配列"abc"をメモリに格納し、プログラムの終了時にそれをクリーンアップするように規定していることを説明しようとしintています。

これを達成する方法はありますか?

4

3 に答える 3

6

"strings literals"あなたが指している静的はどうですか-とにかくコンパイラが内部的にほとんど何をしていると思いますか?

static const int Numbers[] = {1, 2, 3};

struct foo{
    const char* letters = "abc";
    const int* numbers = Numbers;
};
于 2015-04-24T13:25:33.380 に答える
1

Ben Voigtの回答を使用してこれを達成できます。

const int* numbers = sizeof(int) == sizeof(char32_t) ? reinterpret_cast<const int*>(U"\1\2\3") : reinterpret_cast<const int*>(u"\1\2\3");

numbersとして宣言できるという事実によって証明されるように、三項はコンパイルされますconstexpr

この実装にはいくつかの欠点があります。

  1. これは実際にはwchar_t文字列リテラルであり、指定した文字に加えて終端の 0 要素を取得します
  2. intこれは、 anが 32 ビットまたは 16 ビットのいずれかであると想定しています。そうでない場合、これは achar16_tから任意のサイズにキャストしようとし、int大きな問題が発生します。

いずれにせよ、これをマクロに単純化できます。

#define QUOTATION(x) sizeof(int) == sizeof(char32_t) ? reinterpret_cast<const int*>(U ## x) : reinterpret_cast<const int*>(u ## x)

次のように使用できます。

const int* numbers = QUOTATION("\1\2\3"); 
于 2015-04-24T14:46:47.650 に答える