【发布时间】:2015-09-28 22:05:40
【问题描述】:
我在代码中写了这些看似无害的行只是为了命名方便:
struct Foo{
double vec[2];
double& a=vec[0],b=vec[1];
};
但由于某种原因,变量“a”可以正常工作,而“b”则不能(它返回垃圾)。这很奇怪,因为它似乎是valid way to declare them。然后我测试了一些替代方法:
#include <iostream>
using namespace std;
struct Foo{
double vec[2];
double& a=vec[0],b=vec[1]; //does not work
double& c=vec[0];
double& d=vec[1]; //works
double ev,fv;
double& e=ev,f=fv; // does not work
double& g,h; // does not work
Foo() : g(vec[0]) ,h(vec[1]){};
void bar(){
vec[0]=1;
vec[1]=2;
ev=1;
fv=2;
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
cout<<"\nc: "<<c<<endl;
cout<<"d: "<<d<<endl;
cout<<"\ne: "<<e<<endl;
cout<<"f: "<<f<<endl;
cout<<"\ng: "<<g<<endl;
cout<<"h: "<<h<<endl;
double& i=vec[0], j=vec[1]; //works
cout<<"\ni: "<<i<<endl;
cout<<"j: "<<j<<endl;
}
};
int main(int, char **) {
Foo X;
X.bar();
double vec[2];
vec[0]=1;
vec[1]=2;
double& k=vec[0],l=vec[1];//works
cout<<"\nk: "<<k<<endl;
cout<<"l: "<<l<<endl;
}
总之,(a,b)、(e,f) 和 (g,h) 对不能以相同的方式正常工作(即第二个变量返回一些垃圾)。我知道这可以通过写成 (c,d) 来轻松避免,但这整个行为令人费解,特别是因为 (a,b) 在 (i,j) 和 (k,l) 工作时失败,即使主要区别似乎是声明发生的地方。为什么会这样?
注意:C++11 标准。在 g++ 中使用 -pedantic -Wall -Wextra 没有引发任何警告
【问题讨论】:
-
你写
&的那一面是误导性的,引用声明中的&(如指针声明中的*)与变量名组合,而不是类型。跨度> -
在同一行中声明指针和引用是自找麻烦。最好完全避免。
-
@juanchopanza 这种常见错误是我提倡每行一个声明而不考虑类型的原因之一。此外,它使对所述声明的评论更容易。
标签: c++ c++11 declaration member