C++14与C++11——sizeof返回值不同?

3

对于这个程序,C++11返回2 1 2,但是对于C++14来说,它会返回给我2 1 1。我很困惑。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    char a[2];
   cout << sizeof(a) << endl; 

   std::string b("a");
   cout << b.size() << endl;


   char c[b.size() + 1];
   cout << sizeof(c) << endl;

   return 0;
}

你使用的编译器版本是什么?我找到的唯一一个打印“2 1 1”的版本也会在使用-Wall时给出警告:“warning: taking sizeof array of runtime bound”。这可能可以追溯到委员会试图标准化VLA的时间。 - Marc Glisse
1
可变长度数组是C标准的一部分,但不是C++的一部分。https://dev59.com/K3I-5IYBdhLWcg3wYXP8 - edA-qa mort-ora-y
3个回答

15

char c[b.size() + 1]; 在标准的 C++ 中是不允许的,无论哪个版本。

如果您发现编译器可以接受此语句,则这是编译器的扩展功能,因此您应查阅所使用的编译器的文档。


9
以下代码不符合C++标准。
char c[b.size() + 1];

这是一种扩展,有些编译器支持。它们不必符合任何标准。当它们计算 sizeof(c) 时,可能从实现的角度返回任何有意义的结果。


0
除了答案之外,我想要补充的是这个术语被称为变长数组,自C99以来是C++的扩展。VisualC++编译器总是将其输出为错误,但是GCC和Clang不会。
只有当您向标志添加-pedantic标记时,它才会输出warning: ISO C++ forbids variable length array 'c' [-Wvla]警告。

1
VLA不是C++的一部分:https://dev59.com/K3I-5IYBdhLWcg3wYXP8 - edA-qa mort-ora-y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接