是Type name = name;在C ++中有用吗?

时间:2011-08-01 12:03:51

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

C ++中允许使用以下代码:

int a = a;

Type name = name;

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

此类代码是否需要或合理?是否存在此类代码有用的情况?

5 个答案:

答案 0 :(得分:21)

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

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

int main()
{
  Node x = x;
}

答案 1 :(得分:17)

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

Type name = name;

可能没用,但代码

Type name = f(&name);

可能是。

有许多地方语言语法不禁止无用的结构。 : - )

答案 2 :(得分:3)

有时候,如果你有复杂的初始值设定项,那么你必须引用它。这在构造函数中使用,您可以在初始化列表中传递指向this的指针或引用。

答案 3 :(得分:1)

这是有效的,但几乎不用说

int a = a;

更有害,而不是。

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

另一方面,我无法想到需要这样的代码的任何情况,并且由于IMO代码因此语法而变得如此复杂,我的主观意见是,没有任何理由能够编写这样的分配。特别是当人们考虑通过禁止(或至少警告)语法可以防止的所有错误时。

答案 4 :(得分:0)

此类代码永远不会有用会导致不确定性。

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