struct Foo {};
struct Bar : Foo {};
Foo &foo = Bar; // without ()
我想知道,这是一种法律记谱法吗?如果它是合法的,你能提供一些细节吗?有点像,为什么它合法?或者,这种表示法的起源是什么?
编辑:我无法编译此代码。但我遇到了类似的代码,并想知道是否允许这样的符号(可能只是我的编译器不支持这种表示法)。由于以下符号非常合法,我有一些不确定性:Foo *pFoo = new Bar;
答案 0 :(得分:3)
应该是编译器错误。
g ++:错误:在';'之前预期的primary-expression令牌
Bar
是class
的名称,无法将其分配给引用/变量。即使使用()
,它也无法编译,除非您将foo
设为const Foo&
。
答案 1 :(得分:2)
您无法绑定对临时(rvalue)的引用,因此以下操作也是非法的:
Foo &foo = Bar();
您可以将临时(rvalue)绑定到const引用,因此以下是合法的:
const Foo &foo = Bar();
C ++标准特别允许3。
答案 2 :(得分:1)
提供的代码不合法,因为Bar
是类的名称,而不是变量。
然而,以下是:
struct Foo {}
struct Bar : Foo {}
Bar fooBar;
Foo &foo = fooBar; // without ()
这是合法的,因为Bar
是Foo
,因此您只需为变量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)
您无法为参考指定值。因此,如前所述,无论括号如何,这都是不合法的。