【问题标题】:Is it a legal notation: Foo &foo = Bar;是不是一个合法的符号:Foo &foo = Bar;
【发布时间】:2011-10-31 12:09:33
【问题描述】:
struct Foo {};
struct Bar : Foo {};

Foo &foo = Bar; // without ()

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

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

【问题讨论】:

  • 带或不带括号代码是非法的。你真正关心的是什么?你为什么对这个感兴趣?
  • 支持者是怎么回事?这个问题毫无意义,用户甚至没有尝试通过编译器运行代码(任何一种变体)......但是有 2 票赞成?
  • 我认为struct Foo {} 也不合法。
  • 在最好的情况下将类分配给对象往往是一个错误。当你执行“struct Foo”时,你声明了一个名为 Foo 的结构类型,所以这段代码试图将一个类类型 (Foo) 分配给一个对象类型 Foo()
  • @nos:我不认为 可以通过几次击键来修复。或者你认为这合法吗? int (){} 一个正确的问题?它只缺少 4 个字符:main

标签: c++ syntax constructor


【解决方案1】:

应该是编译器错误。

g++: 错误: ';' 之前的预期主表达式令牌

Barclass 的名称,不能分配给引用/变量。即使加上(),它也不会编译,除非你把foo变成const Foo&

【讨论】:

  • 它也不会与() 一起编译...您的答案没有问题,但问题不是一个问题...
  • @DavidRodríguez-dribeas,我已经更新了你的那部分评论。
【解决方案2】:
  1. 您不能将类名称分配给引用/对象。它在语法上既无效,也没有任何意义。
  2. 您不能将引用绑定到临时(右值),因此以下也是非法的:

    Foo &foo = Bar();

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

    const Foo &foo = Bar();

C++ 标准特别允许 3.

【讨论】:

    【解决方案3】:

    显示的代码不合法​​,因为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
    

    【讨论】:

      【解决方案4】:

      您不能为引用分配值。因此,正如已经提到的,无论括号如何,这都是不合法的。

      【讨论】:

      • 您可以将值绑定到const-reference。
      • 这是初始化,不是赋值。
      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多