C++ 如何将C数组转换为std::initializer\u list?

C++ 如何将C数组转换为std::initializer\u list?,c++,gcc,visual-c++,C++,Gcc,Visual C++,我知道数组的指针及其大小。可以从中创建什么容器?我试着这样做: std::initializer_list<int> foo(arr, arr + size); std::初始值设定项\列表foo(arr,arr+大小); 它适用于MSVC,但不适用于gcc如果您需要一个实际的数据拥有容器,那么您需要的是一个。这将花费你一份拷贝和一份分配。如果您所需要的只是像容器一样工作,那么您需要的是即将到来的C++20。它接受一个指针和一个大小,并将其包装在一个类似于数组的接口中 无国界医生

我知道数组的指针及其大小。可以从中创建什么容器?我试着这样做:

std::initializer_list<int> foo(arr, arr + size);
std::初始值设定项\列表foo(arr,arr+大小);

它适用于MSVC,但不适用于gcc如果您需要一个实际的数据拥有容器,那么您需要的是一个。这将花费你一份拷贝和一份分配。如果您所需要的只是像容器一样工作,那么您需要的是即将到来的C++20。它接受一个指针和一个大小,并将其包装在一个类似于数组的接口中

无国界医生使用

std::initializer_list<int> foo(arr, arr + size);

如果您需要一个实际的数据拥有容器,那么您需要的是一个。这将花费你一份拷贝和一份分配。如果您所需要的只是像容器一样工作,那么您需要的是即将到来的C++20。它接受一个指针和一个大小,并将其包装在一个类似于数组的接口中

无国界医生使用

std::initializer_list<int> foo(arr, arr + size);
是一种仅为支持列表初始化而设计的引用类型,并且只有默认的ctor和隐式复制ctor。任何其他ctor都是一个扩展

您可以直接从迭代器范围初始化目标容器,而不涉及任何中间视图

除非你更清楚,否则使用的标准容器是。或者使用像这样的简单视图就足够了吗?

是一种仅为支持列表初始化而设计的引用类型,只有默认的ctor和隐式复制ctor。任何其他ctor都是一个扩展

您可以直接从迭代器范围初始化目标容器,而不涉及任何中间视图


除非你更清楚,否则使用的标准容器是。或者,使用一个简单的视图(比如)就足够了吗?

这里有两个问题,每个问题都有自己的答案


如何将C数组转换为std::initializer\u list

你不能。这样做真的没有意义。实际上只用于初始化(顾名思义)对象。它基本上是由
{}
符号创建的,如下所示:

myObject obj = {0,1,2,3,4};
class foo {
    foo(std::initializer_list list) {
        //...
    }
};
尝试创建一个
std::initializer\u list
的实例在我能想到的任何其他意义上都不是很有用,特别是在C++14之后,因为它有一个
constepr
构造函数


如果某个对象
foo
接受
std::initializer\u列表
,如下所示:

myObject obj = {0,1,2,3,4};
class foo {
    foo(std::initializer_list list) {
        //...
    }
};
您想知道如何在没有
std::initializer\u list
的情况下创建此对象,那么答案就是添加另一个构造函数:

class foo {
    // an actual array
    foo(type arr[size]) {
        //...
    }

    // as a pointer
    foo(type arr*, size_t size) {
        //...
    }
};
如果您使用的是第三方库,或者您不控制的其他库,并且没有其他构造函数,那么很可能不打算以这种方式使用它。在这种情况下,我将咨询您的文档或供应商


可以从中创建什么容器

任何。它们中的大多数都有某种构造函数,它接受指向对象的指针(实际上,从技术上讲,它需要迭代器,但在这种上下文中指针的工作方式相同)或数组。它们的设计非常方便从C数组进行转换。你使用哪一种取决于你的情况

另外,(它没有被列为“序列容器”)被认为是一个可能的容器,可以从C数组以低成本创建。尽管如此,我个人不能为他们担保,因为我对即将到来的标准不太熟悉



最后一点注意:如果MSVC允许这样做,那么要么a)你可能在C++11中(尽管我也不能确认C++11中是否允许这样做,只是构造函数不是C++中的
constexpr
),要么b)这是MSVC中的一个编译器错误。

这里有两个问题,每个问题都有自己的答案


如何将C数组转换为std::initializer\u list

你不能。这样做真的没有意义。实际上只用于初始化(顾名思义)对象。它基本上是由
{}
符号创建的,如下所示:

myObject obj = {0,1,2,3,4};
class foo {
    foo(std::initializer_list list) {
        //...
    }
};
尝试创建一个
std::initializer\u list
的实例在我能想到的任何其他意义上都不是很有用,特别是在C++14之后,因为它有一个
constepr
构造函数


如果某个对象
foo
接受
std::initializer\u列表
,如下所示:

myObject obj = {0,1,2,3,4};
class foo {
    foo(std::initializer_list list) {
        //...
    }
};
您想知道如何在没有
std::initializer\u list
的情况下创建此对象,那么答案就是添加另一个构造函数:

class foo {
    // an actual array
    foo(type arr[size]) {
        //...
    }

    // as a pointer
    foo(type arr*, size_t size) {
        //...
    }
};
如果您使用的是第三方库,或者您不控制的其他库,并且没有其他构造函数,那么很可能不打算以这种方式使用它。在这种情况下,我将咨询您的文档或供应商


可以从中创建什么容器

任何。它们中的大多数都有某种构造函数,它接受指向对象的指针(实际上,从技术上讲,它需要迭代器,但在这种上下文中指针的工作方式相同)或数组。它们的设计非常方便从C数组进行转换。你使用哪一种取决于你的情况

另外,(它没有被列为“序列容器”)被认为是一个可能的容器,可以从C数组以低成本创建。尽管如此,我个人不能为他们担保,因为我对即将到来的标准不太熟悉



最后一点注意:如果MSVC允许这样做,那么要么a)你可能在C++11中(尽管我也不能确认C++11中是否允许这样做,只是构造函数不是C++中的
constepr
),要么b)这是MSVC中的一个编译错误。

初始化器列表
构造函数非常简单:
constepr Initializer\u list()无例外。如果
std::初始值设定项\u列出foo(arr,arr+大小)
在Visual Studio下工作,这是因为它们添加了扩展。
初始值设定项\u list
设计用于带括号的时间列表,它不是一般的容器。您可以使用
ve