它是法律符号吗:Foo &foo = Bar;

Is it a legal notation: Foo &foo = Bar;

本文关键字:foo Bar Foo 符号      更新时间:2023-10-16
struct Foo {};
struct Bar : Foo {};
Foo &foo = Bar; // without ()

我想知道,这是一个合法的符号吗?如果是合法的,你能否提供一些细节?比如,为什么是合法的?或者,这种符号的起源是什么?

EDIT:我无法编译这段代码。但是我遇到了这样的代码,想知道这样的符号是否被允许(可能只是我的编译器不支持这种符号)。我有一些不确定,因为以下符号是相当合法的:Foo *pFoo = new Bar;

应该是编译错误。

g++: error: expected primary-expression before ';' token

Barclass的一个名称,不能赋值给引用/变量。即使使用(),它也不会编译,除非您将foo改为const Foo&

  1. 不能给引用/对象分配类名。它既不符合语法,也没有任何意义。
  2. 不能将引用绑定到临时值(右值),因此以下操作也是非法的:

    Foo &foo = Bar();

  3. 可以将临时(右值)绑定到const引用,因此以下操作是合法的:

    const Foo &foo = Bar();

c++标准特别允许3.

显示的代码是不合法的,因为Bar是一个类的名称,而不是一个变量。

然而,下面是:

struct Foo {}
struct Bar : Foo {}
Bar fooBar;
Foo &foo = fooBar; // without ()

这是合法的,因为BarFoo,所以你只是给你的变量fooBar一个不同的名字。

请注意,尽管foofooBar的别名,但它会将位置解释为Foo对象。

意思是:

struct Foo { int x; };       //note semicolons after struct declaration
struct Bar : Foo { int y; };
Bar fooBar;
fooBar.y = 2;
fooBar.x = 3;
Foo &foo = fooBar;
int aux;
aux = foo.x; // aux == 3
aux = foo.y; // compile error

不能给引用赋值。正如已经提到的,不管括号是什么,这都是不合法的。