C ++中允许使用以下代码:
int a = a;
或
Type name = name;
两者都导致未初始化的对象被自身初始化,这通常会导致未定义的行为。
此类代码是否需要或合理?是否存在此类代码有用的情况?
答案 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初始化),第二种情况也是未定义的行为(在未初始化的对象上调用复制构造函数)。它永远不应该被实践。