gui*_*nca 0 c++ declaration member c++11
为了方便命名,我在代码中写了这些看似无害的行:
struct Foo{
double vec[2];
double& a=vec[0],b=vec[1];
};
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,变量"a"工作正常而"b"没有(它返回垃圾).这很奇怪,因为它似乎是一种有效的方式来声明它们.然后我测试了一些替代方法:
#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;
}
Run Code Online (Sandbox Code Playgroud)
总之,对(a,b),(e,f)和(g,h)不能以相同的方式正常工作(即第二个变量返回一些垃圾).我知道这可以通过写(c,d)来轻松避免,但这整个行为令人费解,特别是因为(a,b)失败,而(i,j)和(k,l)工作,即使主要区别似乎是宣言发生的地方.为什么会这样?
注意:C++ 11标准.在g ++中使用-pedantic -Wall -Wextra并没有抛出任何警告
double& a=vec[0],b=vec[1];
Run Code Online (Sandbox Code Playgroud)
是相同的:
double& a=vec[0];
double b=vec[1];
Run Code Online (Sandbox Code Playgroud)
您可以使用:
double& a=vec[0], &b=vec[1];
Run Code Online (Sandbox Code Playgroud)
或者,最好是:
double& a=vec[0];
double& b=vec[1];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |