C++ int*到常量数组

C++ int*到常量数组,c++,arrays,pointers,constants,quotation-marks,C++,Arrays,Pointers,Constants,Quotation Marks,我问了这个问题: 答案是C++,不为 const int */COD> s提供此功能。这是令人失望的。因此,我的问题是:在实践中,我如何绕过这个限制? 我想写一个这样的结构: struct foo{ const char* letters = "abc"; const int* numbers = ??? }; 我不能: &{1,2,3}因为我无法获取r值的地址 array{{1,2,3}.data()导致初始化后立即清理内存 const int*bar(){return ne

我问了这个问题:

答案是C++,不为<代码> const int */COD> s提供此功能。这是令人失望的。因此,我的问题是:在实践中,我如何绕过这个限制?

我想写一个这样的结构:

struct foo{
    const char* letters = "abc";
    const int* numbers = ???
};
我不能:

  • &{1,2,3}
    因为我无法获取r值的地址
  • array{{1,2,3}.data()
    导致初始化后立即清理内存
  • const int*bar(){return new int[3]{1,2,3};}
    原因任何内容都不会删除此指针
  • 我知道我可以用自动指针来解决这个问题。我不是说
    struct foo
    是好代码,我是想说明编译器在内存中存储const数组
    “abc”
    ,并在程序退出时将其清理干净,我希望有一种方法也能为
    int
    s做到这一点


    有什么方法可以做到这一点吗?

    您所指的静态代码怎么样?我想这就是编译器在内部为
    “strings literals”
    所做的工作

    static const int Numbers[] = {1, 2, 3};
    
    struct foo{
        const char* letters = "abc";
        const int* numbers = Numbers;
    };
    

    字符串文字是您得到的全部内容。然而,它们也足以涵盖大多数整体数据。在你的情况下,你可以使用

    L"\1\2\3"
    

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

    我们可以使用的答案:

    const int* numbers = sizeof(int) == sizeof(char32_t) ? reinterpret_cast<const int*>(U"\1\2\3") : reinterpret_cast<const int*>(u"\1\2\3");
    
    可以像这样使用:

    const int* numbers = QUOTATION("\1\2\3"); 
    

    考虑到你没有给这个问题加上
    c
    标签,我建议把它变成一个类,然后选择选项3?@user3528438如问题中所述:“我并不是说struct foo是好代码……我也希望有一种方法可以用于int。”问题不是关于如何编写
    foo
    @NathanOliver编写更好的
    struct foo
    没有错,但这不是我想知道的。我想知道如何将<代码> INT[]/CODE放入C++内存中,其中C++存储代码> ABC > <代码>,并在程序执行结束时把它清理干净。我不知道为什么我没有想到这一点。@读者,我有一个基于的答案的解决方案:但由于答案中提到的两个缺点,这不应该被认为是一个客厅的把戏。这个答案的唯一缺点是名称空间污染,这可以通过使用匿名名称空间来解决。使用这个策略,这是正确的答案。C++中的代码> WCARGYTT < /代码>保证与代码< int /Cube >的大小相同吗?如果没有,是不是有问题?@user2079303:没有,没有保证。在Win32上,它从来都不是。尽管如此,您仍然可以将非平凡数据存储在字符串文字中。@BenVoigt Hmmm。。。那是
    L
    某种运算符吗?似乎我可以在编译时用模板正确地确定类型和字符串字符大小?@JonathanMee:你可以确定哪个扩展字符类型在编译时与
    int
    的大小相同。虽然
    L
    是文本的一部分,但不确定是否要用宏替换它。@BenVoigt我已经添加了它,它在宏中实现了这一点。我希望用户可以只做
    quote(1,2,3)
    ,但这可能太多了,无法在宏中处理。
    const int* numbers = QUOTATION("\1\2\3");