我不确定以下代码的工作原理。我认为你必须做{'h', 'e' ...etc...}
,但似乎工作正常。另一方面,如果你执行std::array<const char*
,它只会向数组添加一个元素。字符串文字初始化是否有特殊规则?
std::array<char, strlen("hello world!") + 1> s = {"hello world!"};
for (size_t i = 0; i < s.size(); ++i)
{
std::cout << s[i];
}
答案 0 :(得分:4)
类std::array
是一个聚合。在这个声明中:
std::array<char, strlen("hello world!") + 1> s = {"hello world!"};
使用列表初始化。由于类std::array
的此实例化的第一个也是唯一的元素是字符数组,因此可以使用字符串文字进行初始化。
使用sizeof
运算符代替函数strlen
更为正确:
std::array<char, sizeof( "hello world!" )> s = {"hello world!"};
你也可以写
std::array<char, sizeof( "hello world!" )> s = { { "hello world!" } };
因为字符数组又是聚合。
根据C ++标准
8.5.2字符数组[dcl.init.string]
1窄字符类型(3.9.1),char16_t数组,char32_t的数组 数组或wchar_t数组可以用窄字符串文字初始化, char16_t字符串文字,char32_t字符串文字或宽字符串 文字,分别或由适当类型的字符串文字 括在括号内(2.14.5)。连续性的价值 string literal初始化数组的元素。
[例如: char msg [] =“%s \ n”行上的语法错误;
答案 1 :(得分:0)
这是实现此目的的一种方式
// GOAL
std::array<char, sizeof("Hello")> myarray = {"Hello"};
即。 使用字符串文字初始化std :: array (是的,它使用了宏)
// SOLUTION
#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal}
std::array STD_CHAR_ARRAY_INIT(myarray, "Hello");
这是一些测试代码:
#include <iostream>
#include <array>
using std::cout;
using std::ostream;
template<typename T, size_t N>
std::ostream& std::operator<<(std::ostream& os, array<T, N> arr)
{
{
size_t cnt = 0;
char strchar[2] = "x";
for (const T& c : arr) {
strchar[0] = c;
os << "arr[" << cnt << "] = '" << (c == '\0' ? "\\0" : strchar /*string(1, c)*/ ) << "'\n"
<< '.' << c << '.' << '\n';
++cnt;
}
}
return os;
}
#define STD_CHAR_ARRAY_INIT(arrayname, string_literal) /*std::array*/<char, sizeof(string_literal)> arrayname = {string_literal}
int main()
{
std::array STD_CHAR_ARRAY_INIT(myarray, "Hello");
cout << myarray << '\n';
return 0;
}