int *到常量数组

时间:2015-04-24 13:16:50

标签: c++ arrays pointers const quotation-marks

我问了这个问题:Array Equivalent of Bare-String

答案是C ++没有为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}; }因为什么都不会删除此指针
  4. 我知道我可以使用自动指针来解决这个问题。我并不是说struct foo是好代码,我试图说明编译器提供了将const数组"abc"存储在内存中并在程序退出时清理它的规定,我希望有这也是int s的一种方法。

    有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:6)

你指向的静态怎么样 - 我认为这就是编译器在"strings literals"内部做了什么呢?

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

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

答案 1 :(得分:2)

你得到的是字符串文字。但是,它们也足以覆盖大多数整数数据。在您的情况下,您可以使用

L"\1\2\3"

获取由编译器管理的宽字符数组。 C ++ 11及更高版本还支持u8u16u32字符串。

答案 2 :(得分: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将是32位或16位,如果不是这种情况,则会尝试从char16_t转换为任何大小int和你会遇到重大问题
  3. 在任何情况下,我们都可以将其简化为宏:

    #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");