C++ 当我以不同的方式定义对同一变量的引用时,会产生不同的结果

C++ 当我以不同的方式定义对同一变量的引用时,会产生不同的结果,c++,c++11,reference,g++,C++,C++11,Reference,G++,我定义了这样一个类 class A { public: A(int a, int b):a(a),b(b){} void test(const char* name) {cout<<name<<": "<<a<<" "<<b<<endl;} public: int a,b; }; 但是,当我定义两个这样的引用时: A& ref_1=obj, ref_2=obj; 结果很奇怪: r

我定义了这样一个类

class A
{
public:
    A(int a, int b):a(a),b(b){}
    void test(const char* name) {cout<<name<<": "<<a<<"  "<<b<<endl;}
public:
    int a,b;
};
但是,当我定义两个这样的引用时:

    A& ref_1=obj, ref_2=obj;
结果很奇怪:

ref_1: 2  2
ref_2: 1  2
0x7fff58a68c90
0x7fff58a68c90
0x7fff58a68c80
我使用g++作为编译器。 谁能告诉我这件事为什么发生

A& ref_1=obj, ref_2=obj;
相当于

A& ref_1=obj;
A ref_2=obj;
如果你想两者都成为参考,你需要写

A &ref_1=obj, &ref_2=obj;
或者,完全避免这种混淆,只需编写

A& ref_1=obj;
A& ref_2=obj;
就像你最初做的那样

相当于

A& ref_1=obj;
A ref_2=obj;
如果你想两者都成为参考,你需要写

A &ref_1=obj, &ref_2=obj;
或者,完全避免这种混淆,只需编写

A& ref_1=obj;
A& ref_2=obj;
就像你最初做的那样。

当你把它写成&ref_1=obj,ref_2=obj;就好像你写的是

A& ref_1=obj;
A ref_2=obj;
如果你想把它写在一行上,并且两行都是引用,你需要把它写成

A&ref_1=obj,&ref_2=obj

当你把它写成&ref_1=obj,ref_2=obj;就好像你写的是

A& ref_1=obj;
A ref_2=obj;
如果你想把它写在一行上,并且两行都是引用,你需要把它写成


A&ref_1=obj,&ref_2=obj

你与优先权发生了冲突

虽然您编写的内容读作将ref_1和ref_2声明为ref-to-A类型,但&实际上绑定到变量而不是类型。指针也会发生同样的情况。这就是为什么关于编写引用/指针的更正确的方法存在一些持续的争论

A& ref_1; // ref_1 is a reference to type A.
A &ref_1; // means the same thing.

A& ref_1, ref_2;
A &ref_1, ref_2; // same as above.
A &ref_1, &ref_2; // what you thought the first line mean't

A* p1, p2; // p1 is a pointer, p2 is an instance of A
A *p1, *p2; // what you actually intended on the previous line.

你已经与优先权发生了冲突

虽然您编写的内容读作将ref_1和ref_2声明为ref-to-A类型,但&实际上绑定到变量而不是类型。指针也会发生同样的情况。这就是为什么关于编写引用/指针的更正确的方法存在一些持续的争论

A& ref_1; // ref_1 is a reference to type A.
A &ref_1; // means the same thing.

A& ref_1, ref_2;
A &ref_1, ref_2; // same as above.
A &ref_1, &ref_2; // what you thought the first line mean't

A* p1, p2; // p1 is a pointer, p2 is an instance of A
A *p1, *p2; // what you actually intended on the previous line.

也许这有帮助:当您定义为&ref_1=obj,ref_2=obj;编译器将其视为&ref_1=obj;A ref_2=obj;另一个可能有帮助的例子:也许这有帮助:当您定义为&ref_1=obj,ref_2=obj;编译器将其视为&ref_1=obj;A ref_2=obj;另一个可能有用的示例:请注意,空格是在&符号的左侧还是右侧并不重要。您甚至可以在两边都使用空格,或者根本不使用空格。这是一个很好的样式参数:MyType&myRef/MyType*myPtr而不是MyType&myRef/MyType*myPtr,因此每个变量在逗号变量列表中的类型非常明显。请注意,空格是在&符号的左侧还是右侧并不重要。您甚至可以在两边都使用空格,或者根本不使用空格。这是一个很好的样式参数:MyType&myRef/MyType*myPtr而不是MyType&myRef/MyType*myPtr,因此每个变量在逗号变量列表中的类型非常明显。