const char* ch = "hello";
有点像
static const char string_literal[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
const char* ch = &string_literal[0];
除了每个相同的字符串文字不一定指向内存中的不同位置。
其他类型也可以这样:
static int integer_list[] = { 1, 2, 3 };
int* i = &integer_list[0];
// or equivalently, just int* i = integer_list;
现在,i[0] 是 1,i[1] 是 2,i[2] 是 3。
字符串字面量有一种特殊的语法,因为它们被频繁使用,而且在不希望将代码与虚拟变量混淆的上下文中如此频繁。
如果您有很多代码使用静态分配的整数类型的只读数组,您可以使用模板隐藏样板:
template <int a, int b, int c>
struct int_array { static const int values[3]; };
template <int a, int b, int c>
const int int_array<a, b, c>::values[] = { a, b, c };
您只需要定义一次模板,然后每个不同的用户都可以将该模板用于用户感兴趣的特定值。
const int* i = int_array<1, 5, 6>::values;
通常,简单地定义一个单独的数组变量会更容易,但在某些情况下这样的模板会有所帮助。
如 cmets 中所述,可以更通用地定义模板,以便它适用于任意类型和任意长度的数组,但它需要一个对当前版本的 C++ 有良好支持的最新编译器(对于 GCC 和 clang,当前版本很好,但请确保传递 -std=c++11 或 -std=gnu++11 选项以启用 C++11 功能):
template <typename T, T... v>
struct static_array {
static const T values[sizeof...(v)];
};
template <typename T, T... v>
const T static_array<T, v...>::values[sizeof...(v)] = { v... };
现在,这个数组的用户的语法是
const int* i = static_array<int, 1, 2, 3, 4>::values;
const unsigned* j = static_array<unsigned, 1, 2, 3, 4, 5>::values;