C++ C++;:alias members类是如何工作的?

C++ C++;:alias members类是如何工作的?,c++,class,c++11,reference,alias,C++,Class,C++11,Reference,Alias,在以下代码中: class prova: public std::map< int,int > { public: prova():a(5){} int a; }; int main() { std::vector<prova> p; prova obj; p.push_back(obj); return 0; } class prova:public std::map { 公众: prova():a(5){} INTA; }; int main()

在以下代码中:

class prova: public std::map< int,int >
{
 public:
 prova():a(5){}
 int a;

};

int main()
{
 std::vector<prova> p;
 prova obj;
 p.push_back(obj); 
 return 0;
}
class prova:public std::map
{
公众:
prova():a(5){}
INTA;
};
int main()
{
std::向量p;
prova obj;
p、 推回(obj);
返回0;
}
它毫无问题地工作; 如果我添加一个参考成员

class prova: public std::map< int,int >
{
 public:
 prova():a(5){}
 int a;
 int& b=a;
};

int main()
{
 std::vector<prova> p;
 prova obj;
 p.push_back(obj); 
 return 0;
}
class prova:public std::map
{
公众:
prova():a(5){}
INTA;
int&b=a;
};
int main()
{
std::向量p;
prova obj;
p、 推回(obj);
返回0;
}
我有

warning: non-static data member initializers only     available with -std=c++11 or -std=gnu++11 [enabled by default]|
/home/andrea/Scaricati/prova.cpp||In instantiation of ‘void 
std::vector<_Tp,_Alloc>::_M_insert_aux(std::vector<_Tp, _Alloc>::iterator, const _Tp&) 
[with _Tp = prova; _Alloc = std::allocator<prova>; 
std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<prova*, std::vector<prova> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = prova*]’:|
/usr/include/c++/4.8/bits/stl_vector.h|913|required from ‘void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = prova; _Alloc = std::allocator<prova>;   std::vector<_Tp, _Alloc>::value_type = prova]’|
/home/andrea/Scaricati/prova.cpp|19|required from here|
/home/andrea/Scaricati/prova.cpp|4|error: non-static reference member ‘int& prova::b’,     can’t use default assignment operator|
/usr/include/c++/4.8/bits/vector.tcc|335|note: synthesized method ‘prova&     prova::operator=(const prova&)’ first required here     
|||=== Build failed: 1 error(s), 4 warning(s) (0 minute(s), 0 second(s)) ===|

警告:非静态数据成员初始值设定项仅适用于-std=c++11或-std=gnu++11[默认启用]|
/home/andrea/scaricti/prova.cpp | |在“void”的实例化中
std::vector::_M_insert_aux(std::vector::迭代器,const _Tp&)
[with _Tp=prova;_Alloc=std::分配器;
std::vector::iterator=_gnu_cxx::_normal_iterator;typename std:_vector_base::pointer=prova*]:|
/usr/include/c++/4.8/bits/stl_vector.h | 913 |必须来自“void std::vector::push_back(const value_type&)[带有_Tp=prova;_Alloc=std::alloctor;std::vector::value_type=prova]”|
/home/andrea/Scaricti/prova.cpp | 19 |需要从这里开始|

/home/andrea/scaricti/prova.cpp | 4 |错误:非静态引用成员“int&prova::b”,无法使用默认赋值运算符| /usr/include/c++/4.8/bits/vector.tcc | 335 |注:此处首先需要合成方法“prova&prova::operator=(const prova&)” |||==生成失败:1个错误,4个警告(0分钟,0秒))===|
添加警告中建议的-std=g++11没有问题。 如果我删除向量声明,我只得到警告,没有错误。
为什么C++老标准不能做到?引用属性有什么问题?有没有一个系统不用c++11标准就可以做同样的事情?我试着

class prova: public std::map< int,int >
{
 public:
 prova():a(5),b(a){}
 int a;
 int &b;
};
class prova:public std::map
{
公众:
prova():a(5),b(a){}
INTA;
国际酒店;
};

但我会犯错误。为什么会这样?谢谢

您会收到警告,因为您的编译器足够聪明,能够了解C++11的语法。在C++中,这样的语法<代码> int和b= a < /C> >在类成员初始化器,并且在以前的标准中,只能用<代码>静态const < /C>变量。C++11放松了这些约束

发件人:

在C++98中,只能使用整型的
静态常量
成员
在类中初始化,并且初始值设定项必须是常量
表示这些限制确保我们能够做到这一点
编译时初始化

例如:

C++11的基本思想是允许创建非静态数据成员 在声明的位置初始化(在其类中)。构造函数可以 然后在需要运行时初始化时使用初始值设定项。 考虑:

这相当于:


非静态数据成员初始值设定项是C++11的一项功能。不管怎样,如果你保持自引用,你需要自己编写拷贝cTor和赋值操作符,否则事情会变得混乱。“为什么C++旧的标准不能这么做?”:正如警告中所说的,“非静态数据成员初始化器只能用-STD= C++ 11或-STD= GNU++ 11”。老实说,我不知道为什么这不是一个错误-我不知道编译器在C++11之前的模式下对非静态成员初始值设定项做了什么。而且,从标准模板库继承是有点不赞成的,好吧..但是为什么迭代器会出错@VulpRoSSA:因为从LVald中的代码> PUSHOBACK()/CUT>需要复制元素,并且作为错误状态(授予它被埋入一堆噪声中,这仍然是C++模板错误的一个大问题):“错误:非静态引用成员<代码> It和PROVA::b′<代码>,不能使用默认赋值操作符”。因此,正如T.C.所提到的,为了正确处理引用,您需要定义自己的复制操作。第一个是聚合;第二个不是。谢谢,我不知道。我在我的帖子中删除了对C++14的任何提及;我得到错误:非静态引用成员“int&prova::b”,无法使用默认赋值运算符|@volperossa:不确定,可能是您的编译器。在VS2013为我工作。(我从std::map中删除了继承,但这不重要)
int var = 7;

class X {       
    static const int m1 = 7;        // ok       
    const int m2 = 7;               // error: not static        
    static int m3 = 7;              // error: not const         
    static const int m4 = var;      // error: initializer not constant expression 
    static const string m5 = "odd"; // error: not integral type         
    // ...  
}; 
class A {   
public: 
    int a = 7;  
};
class A {   
public:         
    int a;      
    A() : a(7) {}   
};