在以下代码中:
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< 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;
}
我有
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 = g ++ 11,如警告所示。 如果我删除了矢量声明,我只是没有错误的警告。 为什么C ++旧标准无法做到?引用属性有什么问题?有没有使用c ++ 11标准做同样事情的系统?我试试
class prova: public std::map< int,int >
{
public:
prova():a(5),b(a){}
int a;
int &b;
};
但我收到错误。为什么这个?谢谢!
答案 0 :(得分:2)
您收到警告,因为您的编译器足够聪明,可以了解C ++ 11的语法。在C ++中,这种语法int& b= a
被称为类内成员初始化程序,在以前的标准中,这只能用static const
个变量来完成。 C ++ 11放宽了这些限制。
在C ++ 98中,只有
static const
个整数类型的成员可以 在类中初始化,初始化器必须是常量 表达。这些限制确保我们可以做到 在编译时初始化。例如:
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
// ...
};
C ++ 11的基本思想是允许非静态数据成员 初始化声明的位置(在其类中)。构造函数可以 然后在需要运行时初始化时使用初始化程序。 考虑:
class A {
public:
int a = 7;
};
这相当于:
class A {
public:
int a;
A() : a(7) {}
};