2011-10-31 57 views
-1
struct Foo {}; 
struct Bar : Foo {}; 

Foo &foo = Bar; // without() 

我不知道,它是一个合法的符号?如果它是合法的,你能否提供一些细节?类似的,为什么它是合法的?或者,这种符号的起源是什么?它是一个法律符号:Foo&foo = Bar;

编辑:我不能编译的代码。但是我遇到了这样的代码,并想知道是否允许使用这种符号(可能只是我的编译器不支持这种符号)。我有一些不确定性,因为下面的符号是完全合法:Foo *pFoo = new Bar;

+1

有或没​​有括号代码是非法的。你真正关心什么?你为什么对此感兴趣? –

+6

upvoters是什么?这个问题没有意义,用户甚至没有试图通过编译器来运行代码(无论是变体),还是有2个upvotes? –

+0

我不认为'struct Foo {}'也是合法的。 – curiousguy

回答

2
  1. 您不能分配的类名来参考/对象。它既不是句法上有效的也不具有任何意义。
  2. 您不能绑定到一个临时(右值)的引用,因此下面是非法太:

    Foo &foo = Bar();

  3. 您可以临时(右值)绑定到一个const引用,那么以下是合法的:

    const Foo &foo = Bar();

C++标准具体地允许3.

3

这应该是一个编译器错误。

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

Barclass名称和它不能被分配给参考/变量。即使把()不能编译,除非你foo一个const Foo&

+1

也不会用'()'编译......你的答案没有问题,但问题是*不是*问题... –

+1

@DavidRodríguez-dribeas,我更新了你的评论部分。 – iammilind

+0

@iammilind,谢谢 – Loom

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 
0

不能赋值给一个参考。如前所述,无论括号如何,这都不合法。

+0

您可以将一个值绑定到'const'参考。 –

+0

这是初始化,而不是赋值。 –

相关问题