开发者

Inline array initialization

开发者 https://www.devze.com 2023-02-01 23:22 出处:网络
I was used to using new int[] {1,2,3,4,5}; for initializing array. But it seems nowadays, this does not work anymore, i have to explicitly state how many elements there are, with

I was used to using

new int[] {1,2,3,4,5};

for initializing array. But it seems nowadays, this does not work anymore, i have to explicitly state how many elements there are, with

new int[5] {1,2,3,4,5};

so开发者_运维技巧 compilers forgot how to count ?

And to make this a closed question, is there a way to omit the number of elements ?


This has never worked in the current version of C++, you have only been able to zero-initialize (or not initialize) dynamically allocated arrays.

What has always worked is non-dynamically allocated array initialization:

int myarray[] = {1, 2, 3, 4, 5};

Perhaps you are confusing it with this?

Even in C++0x it is not legal syntax to omit the explicit array size specifier in a new expression.


C++ have never allowed to initialize array with an unknown size of elements like above. The only 2 ways I know, is specify the number of elements or use pointers.


With the following test program, test.c++:

int main() {
    int * array = new int[8] { 1, 3, 2, 4, 5, 7, 6, 8 };
    int * brray = new int[] { 1, 3, 2, 4, 5 };
    return 0;
}

Either syntax from OP is fine if the right C++ standard is used:

$ g++ --version
Apple clang version 12.0.0 (clang-1200.0.32.29)

$ g++ -std=c++03 test.c++ ; echo $?
test.c++:2:26: error: expected ';' at end of declaration
        int * array = new int[8] { 1, 3, 2, 4, 5, 7, 6, 8 };
                                ^
test.c++:3:23: error: array size must be specified in new expression with no initializer
        int * brray = new int[] { 1, 3, 2, 4, 5 };
                          ~~~^~
2 errors generated.
1

$ g++ -std=c++11 test.c++ ; echo $?
0

This was tested with g++ (which is clang under the hood) from a recent Xcode on macOS.

To summarize: both are available in C++11 standard, but not in the earlier C++03 standard.


is there a way to omit the number of elements ?

Starting from C++11 yes there is a way. This was proposed in p1009r2.

From new expression's documentation:

double* p = new double[]{1,2,3}; // creates an array of type double[3]

This means that the following is valid with modern C++:

int *p = new int[] {1,2,3,4,5};  //valid for C++11(& onwards)

The above statement creates an array of type int[5].

Demo

0

精彩评论

暂无评论...
验证码 换一张
取 消