可以使用数组大小函数的结果作为数组大小吗?
// 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
为什么?
// 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;
}
I heard that an array size in C++ must be a constant expression. So char q[size(p)]
is invalid, am I right? But I got no errors when I tried
g++ -Wall sizeofarray.cpp
Why?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我不敢苟同这里的所有答案。代码显示完全没问题,除了一个小问题(这绝对不是 VLA),
我想知道 sizeof 的结果始终是 const 值,因此代码应该没问题。
上面的代码在 VS 2010 和 Comeau(严格模式)上构建良好
I beg to differ with all the answers here. The code show is perfectly fine except for a minor issue (which is definitely not VLA)
I was wondering that the result of the sizeof is always a const value, and hence the code should be fine.
The above code builds fine on VS 2010 and Comeau(strict mode)
我使用 g++ 4.4.3 并具有以下别名,这样我就永远不会忘记打开警告:
如果使用上述编译,则会出现一些警告。以下步骤显示不同的选项如何显示不同的警告。
不带警告选项的编译不会显示任何警告
打开
-Wall
打开
-Wextra
最后打开
-pedantic
来捕获真正的问题I use g++ 4.4.3 and have the following alias so that I never forget to turn on the warnings:
If compiled with the above, there would be some warnings. Following steps show how different options show different warnings.
Compilation with no warning option does not show any warning
Turning on
-Wall
Turning on
-Wextra
Finally turning on
-pedantic
to catch the real problem正确的
根据 ISO C++,是的!
这是因为 g++ 支持 VLA (Variable Length数组)作为扩展。
在
C++0x
中有constexpr
功能,借助该功能,您可以编写
char q[size(p)]
是合法的。编辑:另请阅读此内容 文章 [博客等等]
Correct
According to ISO C++, yes!
That's because g++ supports VLA (Variable Length Array) as an extension.
In
C++0x
there isconstexpr
feature with the help of which you can writeand then
char q[size(p)]
would be legal.EDIT : Also read this article [blog whatever]
就像 Prasoon 说的,它不是一个常数表达。现在,您可以获得数组大小的常量表达式值,如下
所示 :模板功能工作关闭">此处。您基本上将数组的大小编码为类型的大小,然后获取该类型的
sizeof
,给出:Like Prasoon says, it's not a constant expression. For now, you can get a constant-expression value of the size of an array like this:
Explanation here. You basically encode the size of the array into the size of a type, then get the
sizeof
of that type, giving you: