int* 到常量数组
int* to Constant Array
我问了这个问题:裸字符串的数组等价物
答案是C++不为const int*
提供此功能。这是令人失望的。所以我的问题是:在实践中,我如何绕过这个限制?
我想写一个这样的结构:
struct foo{
const char* letters = "abc";
const int* numbers = ???
};
我不能:
-
&{1, 2, 3}
因为我无法获取 r 值的地址 -
array<int, 3>{{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"123"
获取编译器管理的宽字符数组。 C++11 及更高版本还支持 u8
、u16
和u32
字符串。
我们可以用Ben Voigt的答案来实现这一点:
const int* numbers = sizeof(int) == sizeof(char32_t) ? reinterpret_cast<const int*>(U"123") : reinterpret_cast<const int*>(u"123");
三元被编译出来,正如您可以将numbers
声明为 constexpr
的事实所证明的那样。
此实现有几个缺点:
- 这实际上是一个
wchar_t
字符串文字,除了您指定的任何字符外,您还将获得一个终止 0 元素 - 这假设
int
将是 32 位或 16 位,如果不是这种情况,这将尝试从char16_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("123");
相关文章:
- 是默认情况下分配给char数组常量的值
- 如何创建长度由常量参数指定的数组
- C++常量数组的编译时间较长
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 使用双指针传递 2D 常量数组
- 将字符串数组传递给接受常量字符**的函数
- 检查输入 std::array 指针数据是否等于某个常量数组
- 为什么不能用常量表达式声明数组?
- 如何在可执行文件中存储常量数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 初始化常量字符* 数组
- C++将常量字符* 指针数组传递给对象
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 如何为包含另一个类实例的数组制作常量 getter?
- LLVM 无法将数组类型强制转换为常量数组
- 如何删除#define使用在c++数组常量
- 静态数组常量是否会影响共享库布局