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

Che*_*lla 2 default rust

我发现了一种不寻常的行为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() };
}
Run Code Online (Sandbox Code Playgroud)

但是如果设置了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() };
}
Run Code Online (Sandbox Code Playgroud)

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

DK.*_*DK. 5

过程中它会导致堆栈溢出.

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

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

impl Default for A {
    fn default() -> A {
        A { x: 1, ..Default::default() }
    }
}
Run Code Online (Sandbox Code Playgroud)

当你说A { ..Default::default() },你不是说" 为每个领域创造一个A并执行Default::default()".这意味着,执行default不是等同于:

A { x: 1, y: Default::default() }
Run Code Online (Sandbox Code Playgroud)

事实上,这是:

let temp: A = Default::default();
temp.x = 1;
temp
Run Code Online (Sandbox Code Playgroud)

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

  • @Cherrionella阻止你制造逻辑错误或解决暂停问题不是编译器的工作.:) (4认同)
  • @DK:嗯,许多形式的无界递归不可能是您想要的,但检测起来很简单,并且可以很容易地为编译器抱怨此类事情形成一个案例。 (2认同)