lifetime 相关问题

变量的生命周期是变量绑定到特定内存位置的时间。生命时间在分配变量时开始,在解除分配时结束。

向量 split_once 方法的生命周期问题

我正在尝试实现一个文件行读取器,它不会进行太多的检查和分配来加速某些文件的读取。 这应该是有效的,但编译器抱怨借用了 self。

回答 1 投票 0

在 Rust 中返回结构变量的引用有什么缺点吗?

给出这个结构: 结构测试S { astr:字符串, } 实现测试S { pub fn new(s: String) -> Self { Self{ astr: s } } pub fn get_ref(&self) -> &String { &self.astr } p...

回答 1 投票 0

隐式生命周期类型和 memcpy 的“简单合格构造函数”的含义

假设您有一个可简单复制的类型,而不是聚合,并且不可简单构造: 结构体Foo { Foo() = 默认值; Foo(整数我) : 人工智能) {}; 整数a=5; }; 福不是...

回答 1 投票 0

借用和内部IntoIterator

虽然我对生命周期很聪明,但编译器再次教会了我...... 错误[E0521]:借用的数据在方法之外转义 玩 pub struct Bugger { 酒吧物品:S, } 实现

回答 1 投票 0

struct的两种实现有什么区别吗?

结构重要摘录<'a> { 部分:&'a str, } impl<'a> 重要摘录<'a> { fn 级别(&'a self) -> i32 { 3 } } 与 结构重要摘录<'a&...

回答 1 投票 0

特征的生命周期作为返回值

我想通过返回 impl 特征(如 create_trait() 中那样)来隐藏从 create 函数返回的实际实现。这怎么可能做到呢? 特质名称<'a> { fn 名字...

回答 3 投票 0

<'a, 'b: 'a>是否意味着生命周期“b”必须比生命周期“a”长?

我想实现一个类似于标准库定义的调试构建器的构建器。它们使用如下结构定义: 结构体 DebugFoo<'a, 'b: 'a> { fmt:&...

回答 3 投票 0

存储 std::format_args 时的生命周期问题

见以下代码: #包括 #包括 #包括 #包括 类异常_t : 公共 std:: 异常 { 民众: 模板 参见以下代码: #include <print> #include <exception> #include <string> #include <format> class exception_t : public std::exception { public: template<class... args_t> exception_t(std::string_view users_fmt, args_t&&... args) : m_users_fmt(users_fmt) , m_format_args(std::move(std::make_format_args(args...))) {} char const* what() const noexcept override { thread_local static std::string s = std::vformat(m_users_fmt, m_format_args); return s.c_str(); } private: std::string m_users_fmt; std::format_args m_format_args; }; int main() try { throw exception_t("{}", 42); } catch (std::exception& e) { std::println("{}", e.what()); } 在使用 SDK 10.0.19041.0 的 MSVC 2022 v143 下调试此问题时,我发现在构建 exception_t 期间,m_format_args 有一个适当的值,但在调用 What() 时,m_format_args 有一个无效值。这很可能是一生的问题,但我看不出出了什么问题。 (大多数情况下这个程序不打印 42) 我在这里做错了什么? ====================================================== HolyBlackCat回复后更新 上面是一个最小的代码片段,但其目的是将格式与异常/错误/警告报告完全分开。我想存储带有参数的标准类型,例如在磁盘上。随后另一个进程从磁盘读取数据并使用本地语言的格式字符串显示数据。这就是为什么我不想在此代码片段的构造函数中调用 std::vformat 的原因。 是否存在 std::format_args 的替代方案?例如。我可以存储参数吗? 我找到了一种存储参数并使程序运行的方法。我需要添加类型variant_t和variants_t并定义用户定义的格式化程序。那么上面的代码片段只需要一些小改动: #include <print> #include <exception> #include <string> #include <format> class exception_t : public std::exception { public: template<class... args_t> exception_t(std::string_view users_fmt, args_t&&... args) : m_users_fmt(users_fmt) , m_variants(args...) {} char const* what() const noexcept override { m_variants.resize(16, 0); thread_local static std::string s = std::vformat(m_users_fmt, std::make_format_args(m_variants[0], m_variants[1], m_variants[2], m_variants[3], m_variants[4], m_variants[5], m_variants[6], m_variants[7], m_variants[8], m_variants[9], m_variants[10], m_variants[11], m_variants[12], m_variants[13], m_variants[14], m_variants[15])); return s.c_str(); } private: std::string m_users_fmt; mutable variants_t m_variants; }; int main() try { throw exception_t("{}", 42); } catch (std::exception& e) { std::println("{}", e.what()); } 这并不完全理想: 参数数量限制为16个 what() 不再是可重入的(您对 const 函数的期望) variant_t、variants_t 和用户定义格式化程序的定义如下: #include <variant> #include <vector> using variant_t = std::variant < bool , char , int , unsigned int , long long , unsigned long long , float , double , long double , void const* >; // helper type for the visitor #4 template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; template<> struct std::formatter<variant_t, char> { template<class parse_context_t> constexpr parse_context_t::iterator parse(parse_context_t& ctx) { for(auto it = ctx.begin(); it != ctx.end(); ++it) { m_format += *it; if (*it == '}') { return it; } } m_format += '}'; return ctx.end(); } template<class fmt_context_t> fmt_context_t::iterator format(variant_t const& variant, fmt_context_t& ctx) const { return std::visit(overloaded{ [&ctx, this](bool v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](char v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](int v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](unsigned int v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](long long v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](unsigned long long v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](float v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](double v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](long double v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](void const* v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, }, variant); } std::string m_format{"{:"}; }; class variants_t : public std::vector<variant_t> { public: constexpr variants_t() = default; template<class... args_t, class T> constexpr variants_t(T first_arg, args_t&&... args) { push_back(first_arg); variants_t v(args...); insert(end(), v.begin(), v.end()); } };

回答 1 投票 0

std::format_args 的生命周期问题

见以下代码: #包括 #包括 #包括 #包括 类异常_t : 公共 std:: 异常 { 民众: 模板 参见以下代码: #include <print> #include <exception> #include <string> #include <format> class exception_t : public std::exception { public: template<class... args_t> exception_t(std::string_view users_fmt, args_t&&... args) : m_users_fmt(users_fmt) , m_format_args(std::move(std::make_format_args(args...))) {} char const* what() const noexcept override { thread_local static std::string s = std::vformat(m_users_fmt, m_format_args); return s.c_str(); } private: std::string m_users_fmt; std::format_args m_format_args; }; int main() try { throw exception_t("{}", 42); } catch (std::exception& e) { std::println("{}", e.what()); } 在使用 SDK 10.0.19041.0 的 MSVC 2022 v143 下调试此问题时,我发现在构建 exception_t 期间,m_format_args 有一个适当的值,但在调用 What() 时,m_format_args 有一个无效值。这很可能是一生的问题,但我看不出出了什么问题。 (大多数情况下这个程序不打印 42) 我在这里做错了什么? ====================================================== HolyBlackCat回复后更新 上面是一个最小的代码片段,但其目的是将格式与异常/错误/警告报告完全分开。我想存储带有参数的标准类型,例如在磁盘上。随后另一个进程从磁盘读取数据并使用本地语言的格式字符串显示数据。这就是为什么我不想在此代码片段的构造函数中调用 std::vformat 的原因。 是否存在 std::format_args 的替代方案?例如。我可以存储参数吗? 我找到了一种存储参数并使程序运行的方法。我需要添加类型variant_t和variants_t并定义用户定义的格式化程序。那么上面的代码片段只需要一些小改动: #include <print> #include <exception> #include <string> #include <format> class exception_t : public std::exception { public: template<class... args_t> exception_t(std::string_view users_fmt, args_t&&... args) : m_users_fmt(users_fmt) , m_variants(std::move(args...)) {} char const* what() const noexcept override { m_variants.resize(16, 0); thread_local static std::string s = std::vformat(m_users_fmt, std::make_format_args(m_variants[0], m_variants[1], m_variants[2], m_variants[3], m_variants[4], m_variants[5], m_variants[6], m_variants[7], m_variants[8], m_variants[9], m_variants[10], m_variants[11], m_variants[12], m_variants[13], m_variants[14], m_variants[15])); return s.c_str(); } private: std::string m_users_fmt; mutable variants_t m_variants; }; int main() try { throw exception_t("{}", 42); } catch (std::exception& e) { std::println("{}", e.what()); } 这并不完全理想: 参数数量限制为16个 what() 不再是可重入的(您对 const 函数的期望) variant_t、variants_t 和用户定义格式化程序的定义如下: #include <variant> #include <vector> using variant_t = std::variant < bool , char , int , unsigned int , long long , unsigned long long , float , double , long double , void const* >; // helper type for the visitor #4 template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; template<> struct std::formatter<variant_t, char> { template<class parse_context_t> constexpr parse_context_t::iterator parse(parse_context_t& ctx) { for(auto it = ctx.begin(); it != ctx.end(); ++it) { m_format += *it; if (*it == '}') { return it; } } m_format += '}'; return ctx.end(); } template<class fmt_context_t> fmt_context_t::iterator format(variant_t const& variant, fmt_context_t& ctx) const { return std::visit(overloaded{ [&ctx, this](bool v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](char v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](int v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](unsigned int v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](long long v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](unsigned long long v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](float v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](double v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](long double v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](void const* v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, }, variant); } std::string m_format{"{:"}; }; class variants_t : public std::vector<variant_t> { public: variants_t() = default; template<class... args_t, class T> variants_t(args_t&&... args, T last_arg) { *this = std::move(variants_t(args...)); push_back(last_arg); } };

回答 1 投票 0

长期运行的Web服务器中arena的生命周期

我正在开发编译器管道,但不确定如何使用 arenas 正确建模 AST 的所有权。 我在 AST 中有类型,表示为对 arenas 的引用(很像 rustc 自己的 TyC...

回答 1 投票 0

UnsafeCell 从函数获取可变引用:无法返回对临时值的引用

我正在尝试 UnsafeCell,这是一个示例: 使用 std::cell::UnsafeCell; fn get_ref_compile_error(cell: &UnsafeCell) -> &mut i32 { &mut 不安全 { *cell.get...

回答 2 投票 0

`diesel::query_builder::Query` 的实现不够普遍错误

我这里有一个 MRE 仓库:https://github.com/hansl/mre-issue-higher-ranked 本质上,我使用的是 Rocket 处理函数,如下所示: #[得到(”/”)] 异步 fn 索引(mut db: Db) -> 字符串 { ...

回答 1 投票 0

Rust 生命周期行为

我试图通过《Programming Rust》一书来理解生命周期,并在这里制作了一个自定义示例: fn simple_fn(点: [&i32; 3]) -> (&i32, &i32) { (点[0],点[2]) } 芬...

回答 1 投票 0

AddDbContext 和 AddDbContextFactory 之间的区别

实际上我是从 Blazor 和 EF Core 开始的。在注册 DbContext 时,我陷入困境。 DbContext 可以使用 AddDbContext 或 AddDbContextFactory 注册。但有什么区别呢? 建造...

回答 2 投票 0

在 Actix 中间件中使用异步函数

我正在使用 Actix 和 Sqlx 制作 Rust API,目前正在开发 JWT 中间件,大部分已经完成,但我想将授权用户检索到我的端点中。这就是下面的代码

回答 1 投票 0

这两个功能有什么区别?他们看起来一样

我是 Rust 的新手。这里有两个函数。当我编译时,foo1 编译通过,foo2 显示错误。但相比foo2他们只是给foo1添加了一个不相关的参数,有什么关系...

回答 1 投票 0

C++ 和 numpy 之间的 python 绑定中复杂的 C++ 生命周期问题

我正在寻找有关如何处理 C++ 和 numpy / Python 之间复杂的生命周期问题的建议。抱歉,文字墙很长,但我想提供尽可能多的背景信息。 我开发了 cvnp,一个

回答 1 投票 0

使用std::array作为存储会调用UB吗?

使用std::array存储作为分配一些内存的存储可以吗? 例如,在 a.data() 上调用placement-new是否安全,即使已分配的生命周期已存在

回答 1 投票 0

使用`std::array`作为存储会调用UB吗?

使用std::array存储作为分配一些内存的存储可以吗? 例如,在 a.data() 上调用placement-new是否安全,即使分配的对象的生命周期...

回答 1 投票 0

超出范围问题?

我使用的框架已经在 CentOS 7 上运行了多年。我们正在将其迁移到 RHEL 8,但一些单元测试失败了。其中一个特别涉及从...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.