可以使用数组大小函数的结果作为数组大小吗?

问题描述 投票:0回答:4
// 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;
}

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

char q[size(p)]
无效,对吗?但我尝试时没有出现错误

 g++ -Wall sizeofarray.cpp

为什么?

c++ arrays templates size c++98
4个回答
4
投票

就像 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))

解释这里。您基本上将数组的大小编码为类型的大小,然后获取该类型的

sizeof
,给出:

char q[sizeof_array(p)];

4
投票

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

正确

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

根据 ISO C++,是的!

但是我尝试时没有遇到错误

g++ -Wall sizeofarray.cpp

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

C++0x
中有
constexpr
功能,您可以借助它来编写

constexpr int size(T (&Array)[N])
{
  return N;
}

然后

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

编辑:另请阅读this文章[博客等等]


-1
投票

我不敢苟同这里的所有答案。代码显示完全没问题,除了一个小问题(绝对不是 VLA)

template <typename T,int N> 
int size(T (&Array)[N]) 
{ 
  return N; 
} 

int main() 
{ 
   char p[]="Je suis trop bon, et vous?"; 
   char q[sizeof(p)]; // (A), not sizeof and not size as in OP
   return 0; 
} 

我想知道 sizeof 的结果始终是 const 值,因此代码应该没问题。

上面的代码在 VS 2010 和 Comeau(严格模式)上构建良好

$5.3.3/6-“结果是一个常数 输入 size_t。 [注:size_t已定义 在标准标题 (18.1) 中。”


-1
投票

我使用 g++ 4.4.3 并具有以下别名,这样我就永远不会忘记打开警告:

$ alias g++
alias g++='g++ -ansi -pedantic -Wall -W -Wconversion -Wshadow -Wcast-qual -Wwrite-strings'

如果使用上述编译,将会出现一些警告。以下步骤显示不同的选项如何显示不同的警告。

不带警告选项的编译不会显示任何警告

$ \g++ sizeofarray.cpp 

开启

-Wall

$ \g++ -Wall sizeofarray.cpp
sizeofarray.cpp: In function ‘int main()’:
sizeofarray.cpp:12: warning: unused variable ‘q’

开启

-Wextra

$ \g++ -Wall -Wextra sizeofarray.cpp 
sizeofarray.cpp: In function ‘int main()’:
sizeofarray.cpp:12: warning: unused variable ‘q’
sizeofarray.cpp: At global scope:
sizeofarray.cpp: In instantiation of ‘int size(T (&)[N]) [with T = char, int N = 27]’:
sizeofarray.cpp:12:   instantiated from here
sizeofarray.cpp:4: warning: unused parameter ‘Array’

终于打开

-pedantic
来发现真正的问题

$ \g++ -Wall -Wextra -pedantic  sizeofarray.cpp 
sizeofarray.cpp: In function ‘int main()’:
sizeofarray.cpp:12: warning: ISO C++ forbids variable length array ‘q’
sizeofarray.cpp:12: warning: unused variable ‘q’
sizeofarray.cpp: At global scope:
sizeofarray.cpp: In instantiation of ‘int size(T (&)[N]) [with T = char, int N = 27]’:
sizeofarray.cpp:12:   instantiated from here
sizeofarray.cpp:4: warning: unused parameter ‘Array’
© www.soinside.com 2019 - 2024. All rights reserved.