为什么对const进行静态引用会返回对临时变量的引用?

扎卡里·伯恩斯(Zachary Burns)

在Rust中,我有以下代码:

pub trait Test: Sized {
    const CONST: Self;
    fn static_ref() -> &'static Self {
        &Self::CONST
    }
}

我的期望是,既然const'static,那么我应该能够引用也是'static但是,编译器给出以下错误:

error[E0515]: cannot return reference to temporary value
   --> file.rs:9:9
    |
  9 |         &Self::CONST
    |         ^-----------
    |         ||
    |         |temporary value created here
    |         returns a reference to data owned by the current function

这里如何引入临时变量?

此外,似乎在某些情况下引用常量确实有效。这是一个简短的具体示例,其中Test的实现略有不同

pub trait Test: Sized {
    fn static_ref() -> &'static Self;
}

struct X;

impl Test for X {
    fn static_ref() -> &'static Self {
        &X
    }
}
E_net4_is_being_impersonated

定义特征时,该定义对于所有可能的实现都必须有意义。

如果没有出现故障的示例,则可能无法立即解决该问题。因此,假设您具有以下类型:

struct MyStruct;
impl MyStruct {
    const fn new() -> Self {
        MyStruct
    }
}

您尝试实现如下特征:

impl Test for MyStruct {
    const CONST: Self = MyStruct::new();
}

这将不起作用,因为static_ref现在的实现将如下所示:

fn static_ref() -> &'static Self {
    // &Self::CONST
    &MyStruct::new()
}

它在函数内部创建一个值并尝试返回它。该值不是静态的,因此'static生存期无效。


但是,只需稍微跳一下,就可以使工作正常:

pub trait Test: Sized + 'static {
    // This is now a reference instead of a value:
    const CONST: &'static Self;
    fn static_ref() -> &'static Self {
        Self::CONST
    }
}

struct MyStruct;
impl MyStruct {
    const fn new() -> Self {
        MyStruct
    }
}

impl Test for MyStruct {
    const CONST: &'static Self = &MyStruct::new();
}

之所以可行,CONST因为它已经是一个'static引用,因此该函数可以将其返回。所有可能的实现都必须能够获取实现该特性'static引用Self,因此引用某个任意局部值不再是问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

返回const左值引用到右值临时?为什么这样做?

来自分类Dev

将const引用返回给临时变量的行为与本地const引用不同吗?

来自分类Dev

为什么临时对象可以绑定到 const 引用?

来自分类Dev

const引用临时引用

来自分类Dev

为什么const方法不能返回非const引用?

来自分类Dev

为什么const方法不能返回非const引用?

来自分类Dev

返回const引用vs临时对象

来自分类Dev

为什么打印char类型变量的引用会返回其中的值?

来自分类Dev

为什么返回引用时不能使用const?

来自分类Dev

为什么返回引用时不能使用const?

来自分类Dev

为什么std :: string的const访问器返回引用?

来自分类Dev

为什么C#列表会添加对变量的引用?

来自分类Dev

为什么const lvalue引用可以引用可变rvalue引用?

来自分类Dev

为什么Clang让我在C ++ 03模式下通过非const临时引用?

来自分类Dev

为什么引用不能捕获临时而const ref和rval ref可以捕获

来自分类Dev

从函数返回的临时引用

来自分类Dev

返回对临时引用

来自分类Dev

返回对临时对象的引用

来自分类Dev

使用const引用对变量进行别名化

来自分类Dev

为什么将静态引用传递给类会消耗内存?

来自分类Dev

const引用临时对象的成员

来自分类Dev

const引用临时对象的成员

来自分类Dev

为什么取消引用字符串迭代器会产生一个 const char 引用?

来自分类Dev

为什么从三元绑定到const引用会产生副本?

来自分类Dev

从临时变量返回的引用是否有效?

来自分类Dev

为什么在引用文字时必须使用const引用

来自分类Dev

C ++ Qt返回对临时引用

来自分类Dev

为什么仍然可以访问对临时对象的引用?

来自分类Dev

为什么在赋值后定义 movex 时,python 3.5 会返回 UnboundLocalError:在赋值之前引用了局部变量“movex”

Related 相关文章

  1. 1

    返回const左值引用到右值临时?为什么这样做?

  2. 2

    将const引用返回给临时变量的行为与本地const引用不同吗?

  3. 3

    为什么临时对象可以绑定到 const 引用?

  4. 4

    const引用临时引用

  5. 5

    为什么const方法不能返回非const引用?

  6. 6

    为什么const方法不能返回非const引用?

  7. 7

    返回const引用vs临时对象

  8. 8

    为什么打印char类型变量的引用会返回其中的值?

  9. 9

    为什么返回引用时不能使用const?

  10. 10

    为什么返回引用时不能使用const?

  11. 11

    为什么std :: string的const访问器返回引用?

  12. 12

    为什么C#列表会添加对变量的引用?

  13. 13

    为什么const lvalue引用可以引用可变rvalue引用?

  14. 14

    为什么Clang让我在C ++ 03模式下通过非const临时引用?

  15. 15

    为什么引用不能捕获临时而const ref和rval ref可以捕获

  16. 16

    从函数返回的临时引用

  17. 17

    返回对临时引用

  18. 18

    返回对临时对象的引用

  19. 19

    使用const引用对变量进行别名化

  20. 20

    为什么将静态引用传递给类会消耗内存?

  21. 21

    const引用临时对象的成员

  22. 22

    const引用临时对象的成员

  23. 23

    为什么取消引用字符串迭代器会产生一个 const char 引用?

  24. 24

    为什么从三元绑定到const引用会产生副本?

  25. 25

    从临时变量返回的引用是否有效?

  26. 26

    为什么在引用文字时必须使用const引用

  27. 27

    C ++ Qt返回对临时引用

  28. 28

    为什么仍然可以访问对临时对象的引用?

  29. 29

    为什么在赋值后定义 movex 时,python 3.5 会返回 UnboundLocalError:在赋值之前引用了局部变量“movex”

热门标签

归档