C++ C++;:结构初始化和映射

C++ C++;:结构初始化和映射,c++,syntax,C++,Syntax,这很好: #include <iostream> #include <map> using namespace std; struct Bar { int i; int f; }; int main() { map<int, Bar> m; Bar b; b.i = 1; b.f = 2; m[0] = b; } #包括 #包括 使用名称空间std; 结构条 { int i; i

这很好:

#include <iostream>
#include <map>

using namespace std;

struct Bar
{
    int i;
    int f;
};

int main()
    {
        map<int, Bar> m;

    Bar b;
    b.i = 1;
    b.f = 2;
    m[0] = b;
}
#包括
#包括
使用名称空间std;
结构条
{
int i;
int f;
};
int main()
{
地图m;
b栏;
b、 i=1;
b、 f=2;
m[0]=b;
}
但如果我想让它更简洁一点,我会犯错误:

int main()
{
    map<int, Bar> m;

    m[0] = {1, 2};
}
intmain()
{
地图m;
m[0]={1,2};
}
有没有办法让结构初始化语法正常工作?我这样做是不对的,还是地图禁止这样做?

不适用于当前标准(C++03)

但是,如果您使用的编译器实现了(),则允许它这样做。

不适用于当前标准(C++03)


但是,如果您使用的编译器实现了(),则允许它这样做。

您可以添加构造函数:
在这种情况下,我会说它比花哨的新初始值设定项更好,因为它实际上让维护人员不必去寻找它,就可以看到地图中放的是什么类型

struct Bar
{
    Bar(int anI,int aJ)
      :i(anI), j(aJ)
    {}
    int i;
    int j;
}

.....

m[0] = Bar(1,2);

您可以添加构造函数:
在这种情况下,我会说它比花哨的新初始值设定项更好,因为它实际上让维护人员不必去寻找它,就可以看到地图中放的是什么类型

struct Bar
{
    Bar(int anI,int aJ)
      :i(anI), j(aJ)
    {}
    int i;
    int j;
}

.....

m[0] = Bar(1,2);
对我来说很好

使用: gcc版本4.4.4 20100503(红帽4.4.4-2)(gcc)

后一种语法抛出警告,但仍在编译,显然这是c++0x语法:

警告:扩展初始值设定项列表仅适用于-std=c++0x或-std=gnu++0x

加上那个开关和墙就可以了。也许可以升级你的编译器?

对我来说很好

使用: gcc版本4.4.4 20100503(红帽4.4.4-2)(gcc)

后一种语法抛出警告,但仍在编译,显然这是c++0x语法:

警告:扩展初始值设定项列表仅适用于-std=c++0x或-std=gnu++0x


加上那个开关和墙就可以了。也许可以升级您的编译器?

+1。下一个标准甚至允许
映射m{{0,{1,2}}约翰内斯>甚至没有考虑过这种可能性,谢谢。我们将进入初始化游行:D+1。下一个标准甚至允许
映射m{{0,{1,2}}约翰内斯>甚至没有考虑过这种可能性,谢谢。我们将进入初始化游行:D