【问题标题】:Is Type name = name; ever useful in C++?是类型名称=名称;在 C++ 中有用吗?
【发布时间】:2012-08-17 14:20:36
【问题描述】:

以下代码在 C++ 中是允许的:

int a = a;

Type name = name;

两者都会导致一个未初始化的对象被自己初始化,这通常会导致未定义的行为。

这样的代码是否需要或合理?有这样的代码有用的案例吗?

【问题讨论】:

  • 我认为您需要澄清您的问题。你问它是“有效代码”还是“这样的代码[是]曾经需要或合理的”?
  • 这让我想起了@AndrewJacksonZA 对this question的回复

标签: c++ variables initialization declaration undefined-behavior


【解决方案1】:

这让我想起了一个旧的thread of the GCC mailing list,其中 Gabriel Dos Reis 给出了以下示例来构造一个单节点循环列表:

struct Node {
  Node* link;
  Node(Node& n) : link(&n) { }
};

int main()
{
  Node x = x;
}

【讨论】:

    【解决方案2】:

    您可以在其初始化程序中使用变量的名称。代码

    Type name = name;
    

    可能没用,但是代码

    Type name = f(&name);
    

    可能会。

    有很多地方的语言语法并没有禁止无用的结构。 :-)

    【讨论】:

      【解决方案3】:

      有时,如果您有复杂的初始化程序,那么您可能不得不参考它。这用于在初始化列表中传递指向 this 的指针或引用的构造函数中。

      【讨论】:

      • 也许,但我想知道如果允许这样做,缺点是否大于好处。
      • 我不明白你的句子,“如果你有复杂的初始化程序,那么你可以参考它”。是谁”? OP 的构造不是总是导致 POD 处于未初始化状态吗?
      • @daramarak: 如果你有一个复杂类型,它需要在它的构造函数中指向你自己的类型的指针或引用,你怎么可能构造它?
      • @daramarak:或者,您可以完全安全地参考它。
      • @Kerrek SB,对于 POD 是的,但 OP 也使用复杂类型。
      【解决方案4】:

      这是有效的,但几乎不言而喻

      int a = a;
      

      比没有更有害。

      至于其他类型,我会说,通过重载复制构造函数并使用默认构造可能会做有用​​的工作。

      另一方面,我想不出任何需要此类代码的情况,并且由于 IMO 代码被这种语法如此复杂,我的主观意见是能够编写这样的作业不是任何好的理由.尤其是当人们考虑到所有可以通过禁止(或至少警告)语法来防止的错误时。

      【讨论】:

      • 这里不涉及赋值运算符。
      • 对不起,我的意思是复制构造函数
      【解决方案5】:

      这样的代码永远不会有用,这会导致不确定性。

      第一种情况是未定义的行为(使用未初始化的 self 初始化),第二种情况也是未定义的行为(在未初始化的对象上调用复制构造函数)。永远不应该这样做。

      【讨论】:

      • 如果您考虑 DeadMGs 的答案,它可能会很有用。使用未初始化的对象进行初始化也不是 UB,但对象的某些用途可能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多