这是一个合法的符号:Foo& foo = Bar;

时间:2011-10-31 12:09:33

标签: c++ syntax constructor

struct Foo {};
struct Bar : Foo {};

Foo &foo = Bar; // without ()

我想知道,这是一种法律记谱法吗?如果它是合法的,你能提供一些细节吗?有点像,为什么它合法?或者,这种表示法的起源是什么?

编辑:我无法编译此代码。但我遇到了类似的代码,并想知道是否允许这样的符号(可能只是我的编译器不支持这种表示法)。由于以下符号非常合法,我有一些不确定性:Foo *pFoo = new Bar;

4 个答案:

答案 0 :(得分:3)

应该是编译器错误。

  

g ++:错误:在';'之前预期的primary-expression令牌

Barclass的名称,无法将其分配给引用/变量。即使使用(),它也无法编译,除非您将foo设为const Foo&

答案 1 :(得分:2)

  1. 您不能将类名称指定给引用/对象。它既没有语法上的有效,也没有任何意义。
  2. 您无法绑定对临时(rvalue)的引用,因此以下操作也是非法的:

    Foo &foo = Bar();

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

    const Foo &foo = Bar();

  4. C ++标准特别允许3。

答案 2 :(得分:1)

提供的代码不合法​​,因为Bar是类的名称,而不是变量。

然而,以下是:

struct Foo {}
struct Bar : Foo {}

Bar fooBar;
Foo &foo = fooBar; // without ()

这是合法的,因为BarFoo,因此您只需为变量fooBar指定其他名称。

但请注意,foo虽然是fooBar的别名,但会将该位置解释为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

答案 3 :(得分:0)

您无法为参考指定值。因此,如前所述,无论括号如何,这都是不合法的。

相关问题