在另一个数组中使用一个数组的大小

Ide*_*one 8 c++ arrays size templates

// sizeofarray.cpp
#include <iostream>
template <typename T,int N>
int size(T (&Array)[N])
{
  return N;
}

int main()
{
   char p[]="Je suis trop bon, et vous?";
   char q[size(p)]; // (A)
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我听说C++中的数组大小必须是一个常量表达式.所以char q[size(p)]无效,我是对的吗?但是当我尝试时,我没有错误

 g++ -Wall sizeofarray.cpp
Run Code Online (Sandbox Code Playgroud)

为什么?

GMa*_*ckG 7

就像Prasoon说的那样,这不是一个持续的表达.现在,您可以获得数组大小的常量表达式值,如下所示:

template <std::size_t N>
struct type_of_size
{
    typedef char type[N];
};

template <typename T, std::size_t Size>
typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))
Run Code Online (Sandbox Code Playgroud)

这里解释.你基本上编码数组类型的大小尺寸,然后得到sizeof那个类型的,给你:

char q[sizeof_array(p)];
Run Code Online (Sandbox Code Playgroud)


Pra*_*rav 5

我听说C++中的数组大小必须是常量表达式。

正确的

所以 char q[size(p)] 无效,对吗?

根据 ISO C++,是的!

但当我尝试时没有出现任何错误

g++ -Wall sizeofarray.cpp

这是因为 g++ 支持 VLA(可变长度数组)作为扩展。

C++0x那里有constexpr一个功能可以帮助您编写

constexpr int size(T (&Array)[N])
{
  return N;
}
Run Code Online (Sandbox Code Playgroud)

然后char q[size(p)]就合法了。

编辑:另请阅读这篇文章[博客无论如何]