在同一行中声明成员引用变量
Declaring member reference variables in the same line
为了命名方便,我在代码中写了这些看似无害的行:
struct Foo{
double vec[2];
double& a=vec[0],b=vec[1];
};
但由于某些原因,变量 "a" 工作正常而 "b" 不工作(它 returns 垃圾)。这很奇怪,因为它似乎是 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) 不能以相同的方式正常工作(即第二个变量 returns 一些垃圾)。我知道这可以很容易地通过像 (c,d) 这样写来避免,但是整个行为令人费解,特别是因为 (a,b) 在 (i,j) 和 (k,l) 工作时失败,即使主要区别似乎是声明发生的地方。为什么会这样?
注:C++11标准。在 g++ 中使用 -pedantic -Wall -Wextra 没有抛出任何警告
至于指针,将 &
放在 space 之前或之后,不会改变任何东西。
这将起作用:
double &a=vec[0],&b=vec[1];
这也行得通:
double& a=vec[0], &b=vec[1];
第一个 &
仅用于 a
第二个用于 b
double& a=vec[0],b=vec[1];
等同于:
double& a=vec[0];
double b=vec[1];
您可以使用:
double& a=vec[0], &b=vec[1];
或者,最好是:
double& a=vec[0];
double& b=vec[1];
为了命名方便,我在代码中写了这些看似无害的行:
struct Foo{
double vec[2];
double& a=vec[0],b=vec[1];
};
但由于某些原因,变量 "a" 工作正常而 "b" 不工作(它 returns 垃圾)。这很奇怪,因为它似乎是 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) 不能以相同的方式正常工作(即第二个变量 returns 一些垃圾)。我知道这可以很容易地通过像 (c,d) 这样写来避免,但是整个行为令人费解,特别是因为 (a,b) 在 (i,j) 和 (k,l) 工作时失败,即使主要区别似乎是声明发生的地方。为什么会这样?
注:C++11标准。在 g++ 中使用 -pedantic -Wall -Wextra 没有抛出任何警告
至于指针,将 &
放在 space 之前或之后,不会改变任何东西。
这将起作用:
double &a=vec[0],&b=vec[1];
这也行得通:
double& a=vec[0], &b=vec[1];
第一个 &
仅用于 a
第二个用于 b
double& a=vec[0],b=vec[1];
等同于:
double& a=vec[0];
double b=vec[1];
您可以使用:
double& a=vec[0], &b=vec[1];
或者,最好是:
double& a=vec[0];
double& b=vec[1];