std :: array初始化如何为char的工作?
我不确定下面的代码是如何工作的。 我以为你必须做{'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];
}
类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)。 字符串字面值的连续字符初始化数组的元素。
[示例:char msg [] =“第%s行的语法错误 n”;
这是实现这一点的一种方式
// 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 == ' ' ? " " : 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;
}
链接地址: http://www.djcxy.com/p/81475.html
上一篇: How does std::array initializer work for char's?
下一篇: Adding references in PHP to an array creates an array of references