在嵌套结构上实现Default会导致堆栈溢出

时间:2015-06-20 01:56:00

标签: rust default

我发现了std::default的异常行为。如果使用默认设置器创建嵌套结构并尝试使用默认参数创建最高级别的结构,则会导致堆栈溢出。

此代码编译,但是当您尝试运行它时会抛出thread '<main>' has overflowed its stack

use std::default;

pub struct A {
    x: i32
}

impl Default for A {
    fn default() -> A {
        A { ..Default::default() }
    }
}

fn main() {
    let test = A { ..Default::default() };
}

但是如果设置了props继承的默认值,它就可以工作:

use std::default;

pub struct A {
    x: i32
}

impl Default for A {
    fn default() -> A {
        A { x: 0 }
    }
}

fn main() {
    let test = A { ..Default::default() };
}

这是一个已知问题,我应该将其发布到Rust问题跟踪器吗?我的编译器版本是rustc 1.2.0-nightly (0250ff9a5 2015-06-17)

1 个答案:

答案 0 :(得分:5)

当然会导致堆栈溢出。

为了更清楚,让我们稍微改变一下这个例子:

pub struct A {
    x: i32,
    y: i32,
}

impl Default for A {
    fn default() -> A {
        A { x: 1, ..Default::default() }
    }
}

当您说A { ..Default::default() }时,您说“为我创建A并为每个字段执行Default::default()”。这意味着default的实施等同于:

A { x: 1, y: Default::default() }

事实上,这是:

let temp: A = Default::default();
temp.x = 1;
temp

所以是的,它会导致堆栈溢出:你已经根据自己定义了A的默认值。