Questions tagged «lifetime»

5
C ++函数中静态变量的生存期是多少?
如果将变量声明为static在函数范围内,则该变量仅初始化一次,并在函数调用之间保留其值。它的寿命到底是什么?何时调用其构造函数和析构函数? void foo() { static string plonk = "When will I die?"; }
373 c++  static  lifetime 

2
为什么不能在同一结构中存储值和对该值的引用?
我有一个值,我想以自己的类型存储该值和对该值中内容的引用: struct Thing { count: u32, } struct Combined<'a>(Thing, &'a u32); fn make_combined<'a>() -> Combined<'a> { let thing = Thing { count: 42 }; Combined(thing, &thing.count) } 有时,我有一个值,并且想在同一结构中存储该值和对该值的引用: struct Combined<'a>(Thing, &'a Thing); fn make_combined<'a>() -> Combined<'a> { let thing = Thing::new(); Combined(thing, &thing) } 有时,我什至没有引用该值,并且得到了相同的错误: struct Combined<'a>(Parent, Child<'a>); fn make_combined<'a>() …

10
为什么在Rust中需要显式的生存期?
我正在阅读Rust书的终生一章,并且遇到了这个示例,它给出了一个有名/显式的终生: struct Foo<'a> { x: &'a i32, } fn main() { let x; // -+ x goes into scope // | { // | let y = &5; // ---+ y goes into scope let f = Foo { x: y }; // ---+ f goes into scope x = …

1
什么是非词汇寿命?
Rust具有与非词汇生存期相关的RFC,该RFC已被批准长时间使用该语言来实现。最近,Rust对此功能的支持已改进很多,并被认为是完整的。 我的问题是:非词汇寿命到底是什么?

9
C中字符串文字的“生存期”
下列函数返回的指针不会不可访问吗? char *foo(int rc) { switch (rc) { case 1: return("one"); case 2: return("two"); default: return("whatever"); } } 因此,C / C ++中局部变量的生存期实际上仅在函数内,对吗?这意味着char* foo(int)终止后返回的指针不再意味着什么,对吗? 我对局部变量的生存期感到困惑。什么是好的澄清?

1
在自己的初始化器中使用变量
C ++ 20标准草案的[basic.scope.pdecl] / 1在注释中具有以下(非规范性)示例(合并请求3580之前的部分引号,请参见此问题的答案): unsigned char x = x; x使用其自己的(不确定的)值初始化。 这实际上在C ++ 20中具有明确定义的行为吗? 通常T x = x;,由于在初始化完成之前x的值是不确定的,因此表单的自我初始化具有未定义的行为。评估不确定值通常会导致未定义的行为([basic.indent] / 2),但是[basic.indent] /2.3中有一个特定的例外,该例外允许直接unsigned char从unsigned char具有不确定值的左值初始化变量(导致使用不确定值进行初始化) )。 这本身并不会因此导致不确定的行为,但会为其他类型T不属于无符号窄字符类型或std::byte如int x = x;。这些注意事项同样适用于C ++ 17及之前的版本,另请参见底部的链接问题。 但是,即使对于unsigned char x = x;,当前草案的[basic.lifetime] / 7也表示: 类似地,使用不依赖于其值的glvalue的属性,在其生命周期开始之前已得到明确定义。该程序在以下情况下具有未定义的行为: glvalue用于访问对象,或者 [...] 这似乎暗示x示例中的值只能在其生命周期内使用。 [basic.lifetime] / 1说: [...] 类型为T的对象的生存期始于以下情况: [...]和 它的初始化(如果有的话)已经完成(包括真空初始化)([dcl.init]), [...] 因此,x仅在初始化完成后才开始生命周期。但是在引用的示例中,x在x初始化完成之前使用的值。因此,使用具有未定义的行为。 …

1
自C ++ 20起允许在分配的存储上使用指针算术吗?
在C ++ 20标准中,据说数组类型是隐式生存期类型。 这是否意味着可以隐式创建非隐式生命周期类型的数组?这样的数组的隐式创建会不会导致创建数组的元素? 考虑这种情况: //implicit creation of an array of std::string //but not the std::string elements: void * ptr = operator new(sizeof (std::string) * 10); //use launder to get a "pointer to object" (which object?) std::string * sptr = std::launder(static_cast<std::string*>(ptr)); //pointer arithmetic on not created array elements well defined? …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.