【问题标题】:How does std::array initializer work for char's?std::array 初始化程序如何为 char 工作?
【发布时间】:2014-09-17 19:33:35
【问题描述】:

我不确定以下代码是如何工作的。我以为你必须这样做 {'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];
}

【问题讨论】:

    标签: c++ c++11 stdarray


    【解决方案1】:

    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 Character arrays [dcl.init.string]

    1 窄字符类型数组 (3.9.1),char16_t 数组,char32_t 数组或wchar_t 数组可以由窄字符串字面量初始化, char16_t 字符串文字、char32_t 字符串文字或宽字符串 文字,分别或通过适当类型的字符串文字 括在大括号中(2.14.5)。值的连续字符 字符串字面量初始化数组的元素。

    [示例:

    char msg[] = "Syntax error on line %s\n";
    

    【讨论】:

      【解决方案2】:

      这是实现此目的的一种方法

      // 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-05
        • 2012-02-10
        • 1970-01-01
        • 2020-01-27
        • 2021-03-19
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        相关资源
        最近更新 更多