【问题标题】:Declaring member reference variables in the same line在同一行中声明成员引用变量
【发布时间】: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 没有引发任何警告

【问题讨论】:

  • 你写 &amp; 的那一面是误导性的,引用声明中的 &amp;(如指针声明中的 *)与变量名组合,而不是类型。跨度>
  • 在同一行中声明指针和引用是自找麻烦。最好完全避免。
  • @juanchopanza 这种常见错误是我提倡每行一个声明而不考虑类型的原因之一。此外,它使对所述声明的评论更容易。

标签: c++ c++11 declaration member


【解决方案1】:
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];

【讨论】:

  • 所以看起来失败的人这样做是因为他们是双打(不是引用)并且收到了最初在 vec 中的垃圾。谢谢
【解决方案2】:

至于指针,将&amp; 放在空格之前或之后,不会改变任何内容。

这将起作用:

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

这也会起作用:

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

第一个&amp; 仅用于a 第二个用于b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2010-12-07
    • 2017-06-14
    • 2019-01-21
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多