码:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
Run Code Online (Sandbox Code Playgroud)
为什么我需要std :: array的双花括号?
考虑以下程序:
#include <array>
int main()
{
std::array<int, 1> x = { 0 }; // warning!
x = { { 0 } }; // no warning
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一次初始化导致gcc 4.7.2上的警告......
main.cpp:5:22: warning: unused variable ‘x’ [-Wunused-variable]
Run Code Online (Sandbox Code Playgroud)
......和铿锵3.1
main.cpp:5:28: warning: suggest braces around initialization of subobject [-Wmissing-braces]
std::array<int, 1> x = { 0 };
Run Code Online (Sandbox Code Playgroud)
就标准而言,双花键或单花括号之间应该没有区别,至少在这个例子中.
有两种方法可以处理警告:
你有什么建议?恕我直言,双卷曲表达看起来有些难看.另一方面,警告可能会在更复杂的示例中检测到实际问题.你知道这个警告对你有帮助的例子吗?
我有以下代码:
enum class MessageDeliveryMethod
{
POST_MASTER,
BUBBLE,
NUM_ENUMERATORS
};
namespace
{
using MapType = std::array<
std::pair<char const*, MessageDeliveryMethod>,
static_cast<std::size_t>(MessageDeliveryMethod::NUM_ENUMERATORS)
>;
MapType g_mapping = {{
{"POST_MASTER", MessageDeliveryMethod::POST_MASTER},
{"BUBBLE", MessageDeliveryMethod::BUBBLE},
}};
}
Run Code Online (Sandbox Code Playgroud)
编译,但我不知道为什么.该g_mapping变量需要额外级别的看似冗余的花括号.换句话说,我希望初始化看起来像:
MapType g_mapping = {
{"POST_MASTER", MessageDeliveryMethod::POST_MASTER},
{"BUBBLE", MessageDeliveryMethod::BUBBLE},
};
Run Code Online (Sandbox Code Playgroud)
(移除了一层外括号).
我的理解是,在C++ 14之前,当进行直接初始化时,需要额外的括号级别.但是,复制初始化不应该基于此页面需要这个(请查看那里的示例).
有谁能解释一下?
这个被我的问题推测重复的SO问题确实回答了一些具体和有用的问题(与我自己有关),但是由于使用pair(我认为这最初是导致问题)而导致混乱.我从来没有在第一时间找到那个问题,所以如果我认为也许我说出问题的方式可能会帮助人们从不同的角度来解决问题.
我用下面的方法初始化一个CandyBar结构数组,但编译器总是在struct initializer中说多余的元素.我尝试在数组定义中只放置一个结构初始化器,它已编译,但数组的其余2个元素为null
我该怎么办?
struct CandyBar{
string brand;
float weight;
int calories;
};
int main(int argc, const char * argv[]) {
array<CandyBar, 3> ary_cb =
{
{"Mocha Munch", 2.3, 350},
{"Mocha Munch", 2.3, 350},
{"Mocha Munch", 2.3, 350}
};
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在 C++ 中,是否可以直接从另一个数组初始化内置数组?据我所知,一个数组只能有一个数组,然后将每个元素从另一个数组复制/移动到它,这是某种赋值,而不是初始化。