它是法律符号吗:Foo &foo = Bar;
Is it a legal notation: Foo &foo = Bar;
struct Foo {};
struct Bar : Foo {};
Foo &foo = Bar; // without ()
我想知道,这是一个合法的符号吗?如果是合法的,你能否提供一些细节?比如,为什么是合法的?或者,这种符号的起源是什么?
EDIT:我无法编译这段代码。但是我遇到了这样的代码,想知道这样的符号是否被允许(可能只是我的编译器不支持这种符号)。我有一些不确定,因为以下符号是相当合法的:Foo *pFoo = new Bar;
应该是编译错误。
g++: error: expected primary-expression before ';' token
Bar
是class
的一个名称,不能赋值给引用/变量。即使使用()
,它也不会编译,除非您将foo
改为const Foo&
。
- 不能给引用/对象分配类名。它既不符合语法,也没有任何意义。
-
不能将引用绑定到临时值(右值),因此以下操作也是非法的:
Foo &foo = Bar();
-
可以将临时(右值)绑定到const引用,因此以下操作是合法的:
const Foo &foo = Bar();
c++标准特别允许3.
显示的代码是不合法的,因为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
不能给引用赋值。正如已经提到的,不管括号是什么,这都是不合法的。
相关文章:
- ld: foo.o:foo.h:6 'bar' 的多重定义 foo.h:6: 首先在这里定义
- C++ "var foo = !!::bar()"语法?
- What does int foo = bar << ' '; mean in c++?
- 在"bar::foo"的定义中使用"foo"
- 为什么 foo(short int *) 和 bar(signed short *) 认为 QT 的签名不同
- 为什么我需要双括号在构造函数调用中,如:foo x((bar());
- g++ 拒绝,clang++ 接受: foo(x)( "bar" )( "baz" );
- 在 C++11 中使用 auto foo = "bar" vs std::string
- 为什么"Foo f(Bar());"可以是采用 Bar 类型并返回类型 Foo 的函数的声明?
- What is an `int foo::*bar::*`?
- 未解析的外部符号"public: class Foo __thiscall Bar::bu(char const *)"
- 使用 foo::bar 不会屏蔽 typedef-name ::bar?
- 类Bar{操作符Foo();}
- 它是法律符号吗:Foo &foo = Bar;
- 命名空间中的'Foo' 'bar' 不命名头文件中对象成员的类型
- std::vector<Bar> 作为类 Foo 中的成员变量需要一个空的构造函数
- 对foo::bar static ofstream的未定义引用
- 在C++中,foo::bar::baz()的含义是什么
- 以下对象的名称未知:类Foo::Bar
- Qt MOC错误的名称空间,如FOO::BAR