我认为我模糊地回忆起一个较新的c ++标准(也许是它的c ++ 11,或者可能是14?... 17 ??)允许你初始化一个结构,你可以定义一个结构然后初始化它而不必编写构造函数。
E.g:
struct test
{
int a;
int b;
std::string str;
};
int main()
{
std::map<int, test> test_map;
test_map[0] = test(1, 2, "test1"); // This is the line in question
// Or it might be more like: test_map[0] = test{1, 2, "test1"};
return 0;
}
我不记得这个特殊初始化的名称(或者它是否存在)!所以我的问题是:
如果这个“特征”不存在那么请把我从痛苦中解救出来!可能是我的想象力已经成功了......
答案 0 :(得分:4)
没有构造函数,你可以这样做
test_map[0] = test{ 1, 2, "test1" };
或只是
test_map[0] = { 1, 2, "test1" };
答案 1 :(得分:4)
“没有构造函数的初始化”被称为聚合初始化,它从第1天起就一直是C ++的一部分。不幸的是,有些人可能会说。
在C ++ 98中你可以写:
std::map<int, test> test_map;
test temp = { 1, 2, "test1" };
test_map[0] = temp;
C ++ 11补充说你可以在prvalues中使用聚合初始化,所以你不需要声明中间变量(并且没有额外的副本):
std::map<int, test> test_map;
test_map[0] = { 1, 2, "test1" };
std::map<int, test> m2 = { {0, {1, 2, "test2"}} }; // and this
答案 2 :(得分:1)
您还可以默认初始化:
struct test {
int a{1};
int b{2};
std::string str{"test1"};
};
或者在没有作业的情况下构建:
std::map<int, test> test_map{
{0, {1, 2, "test1"}}
};
或者不带副本插入:
test_map.emplace(std::piecewise_construct,
std::forward_as_tuple(0),
std::forward_as_tuple(1, 2, "test1"));