2015-09-28 9 views
0

я писал эти кажущиеся безобидными линии внутри моего кода только для именования удобства:Объявление ссылки член переменных в одной строке

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 ++ не выдавало никаких предупреждений

+0

стороне, где вы пишете '&' является недостоверным, то '&' в качестве ссылки декларации (как ' * 'в объявлениях указателей) группы с именем переменной, а не с типом. –

+0

Объявление указателей и ссылок в одной строке вызывает проблемы. Лучше избегайте его вообще. – juanchopanza

+0

@juanchopanza Этот тип распространенной ошибки - одна из причин, по которой я выступаю за одну декларацию за строку независимо от типа. Кроме того, он упрощает комментирование указанной декларации. – Casey

ответ

7
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]; 
+0

Таким образом, кажется, что те, кто потерпел неудачу, сделали это потому, что они были двойниками (а не ссылками) и получили мусор, который изначально был в vec. благодаря – guivenca

4

Что касается указателей, положив & перед пробелом или после него, ничего не меняя.

Это будет работать:

double &a=vec[0],&b=vec[1]; 

, а также это будет работать:

double& a=vec[0], &b=vec[1]; 

первый & идет только a второй для b

Смежные вопросы