int* 到常量数组
int* to Constant Array
我问了这个问题:
答案是 C++ 不为 const int*
提供此功能。这是令人失望的。所以我的问题是:在实践中我如何绕过这个限制?
我想写一个这样的结构:
struct foo{
const char* letters = "abc";
const int* numbers = ???
};
我不能:
&{1, 2, 3}
因为我无法获取右值的地址
array<int, 3>{{1, 2, 3}}.data()
因为内存在初始化后立即被清理
const int* bar(){ return new int[3]{1, 2, 3}; }
因为什么都不会删除这个指针
我知道我可以使用自动指针来解决这个问题。我并不是说 struct foo
是好的代码,我只是想说明编译器规定将常量数组 "abc"
存储在内存中并在程序退出时清理它,我希望有int
也是一种方法。
有办法做到这一点吗?
您指向的静态变量如何 - 我认为这就是编译器在内部为 "strings literals"
所做的大部分工作?
static const int Numbers[] = {1, 2, 3};
struct foo{
const char* letters = "abc";
const int* numbers = Numbers;
};
字符串文字就是您所得到的。但是,它们也足以涵盖大多数完整数据。在您的情况下,您可以使用
L""
获取编译器管理的宽字符数组。 C++11 及更高版本还支持 u8
、u16
和 u32
字符串。
我们可以使用 Ben Voigt 的回答来完成这个:
const int* numbers = sizeof(int) == sizeof(char32_t) ? reinterpret_cast<const int*>(U"") : reinterpret_cast<const int*>(u"");
三进制被编译出来,事实证明你可以将 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("");
我问了这个问题:
答案是 C++ 不为 const int*
提供此功能。这是令人失望的。所以我的问题是:在实践中我如何绕过这个限制?
我想写一个这样的结构:
struct foo{
const char* letters = "abc";
const int* numbers = ???
};
我不能:
&{1, 2, 3}
因为我无法获取右值的地址array<int, 3>{{1, 2, 3}}.data()
因为内存在初始化后立即被清理const int* bar(){ return new int[3]{1, 2, 3}; }
因为什么都不会删除这个指针
我知道我可以使用自动指针来解决这个问题。我并不是说 struct foo
是好的代码,我只是想说明编译器规定将常量数组 "abc"
存储在内存中并在程序退出时清理它,我希望有int
也是一种方法。
有办法做到这一点吗?
您指向的静态变量如何 - 我认为这就是编译器在内部为 "strings literals"
所做的大部分工作?
static const int Numbers[] = {1, 2, 3};
struct foo{
const char* letters = "abc";
const int* numbers = Numbers;
};
字符串文字就是您所得到的。但是,它们也足以涵盖大多数完整数据。在您的情况下,您可以使用
L""
获取编译器管理的宽字符数组。 C++11 及更高版本还支持 u8
、u16
和 u32
字符串。
我们可以使用 Ben Voigt 的回答来完成这个:
const int* numbers = sizeof(int) == sizeof(char32_t) ? reinterpret_cast<const int*>(U"") : reinterpret_cast<const int*>(u"");
三进制被编译出来,事实证明你可以将 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("");