函数调用中的std::数组隐式初始化
std::array implicit initialization in function call
可能重复:
初始化项列表中何时可以省略外大括号?
我在VisualStudio2010中使用std::array
,实际上是std::tr1::array
,我遇到了一个烦人的问题。例如,我有一个函数,它将array
作为参数。
void do_something(std::tr1::array<int, 5> data)
调用类似do_something({1,2,3});
的函数不起作用,并导致编译器错误,但是
std::tr1::array<int, 5> data = {1,2,3};
do_something(data);
确实如此。我真的不明白为什么前者不起作用。我收到的错误告诉我,我在{
之前错过了一个)
。这让我相信它不需要初始化列表,但我不明白为什么不需要。我是否滥用初始化列表?
编辑:std::tr1::array
不是必需的,std::array
工作得很好。。
试试这个
do_something({{1,2,3}});
std::array
使用2组大括号进行初始化,但在某些情况下(例如您发布的示例(,您可以省略外部伪大括号。这可能会有所帮助:C++11:正确的std::数组初始化?
需要额外的大括号,因为std::array
是一个聚合和POD,与标准库中的其他容器不同。std::array
没有用户定义的构造函数。它的第一个数据成员是一个大小为N
的数组(作为模板参数传递(,该成员直接用初始值设定项初始化。直接初始化的内部数组需要额外的大括号。
可以这样想:
struct A
{
int data[2];
};
创建A
的实例时需要多少个大括号?
A a{1,2}; //wrong as per the Standard (the compiler might allow it)
A b{ {1,2 } }; //correct
在b
中,{}
的外对用于结构,{}
的内对用于成员数组。
希望能有所帮助。
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组