я писал эти кажущиеся безобидными линии внутри моего кода только для именования удобства:Объявление ссылки член переменных в одной строке
struct Foo{
double vec[2];
double& a=vec[0],b=vec[1];
};
Но по какой-то причине переменная «а» отлично работает и «б» нет (он возвращает мусор). Это странно, так как это было 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;
}
Таким образом, пары (а, Ь), (е, е) и (ж, з) не работают должным образом таким же образом (т.е. вторая переменная возвращает некоторый мусор). Я знаю, что это можно было бы легко избежать, написав как (c, d), но все это поведение вызывает недоумение, особенно потому, что (a, b) терпит неудачу, пока работают (i, j) и (k, l), хотя основное различие представляется, что объявление происходит. Почему это так?
Примечание: C++ 11 стандарт. Использование -pedantic -Wall -Wextra в g ++ не выдавало никаких предупреждений
стороне, где вы пишете '&' является недостоверным, то '&' в качестве ссылки декларации (как ' * 'в объявлениях указателей) группы с именем переменной, а не с типом. –
Объявление указателей и ссылок в одной строке вызывает проблемы. Лучше избегайте его вообще. – juanchopanza
@juanchopanza Этот тип распространенной ошибки - одна из причин, по которой я выступаю за одну декларацию за строку независимо от типа. Кроме того, он упрощает комментирование указанной декларации. – Casey