- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在C++中,我们可以创建临时值,这些临时值是有生命周期的。
来自 cppreference.com :
All temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created, and if multiple temporary objects were created, they are destroyed in the order opposite to the order of creation. ...
...
- The lifetime of a temporary object may be extended by binding to a const lvalue reference or to an rvalue reference (since C++11), see reference initialization for details.
可以编写一个表达式,使得结果对象将具有相关的右值引用。可以通过分配一个非引用对象并将临时对象的内容移入其中来删除这些依赖关系,但由于额外的移动/复制,这会比仅使用临时对象效率低。
通过插入这样一个带有依赖临时对象的表达式作为函数参数,这将导致函数接收一个有效的对象。这是因为表达式已成为完整表达式的子表达式。
但是,如果要延长由同一个表达式创建的对象的生命,该表达式现在已成为完整表达式,所以我希望临时对象在最坏的情况下继续使用最终临时对象在最好的情况下,或者只是依赖的。然而,似乎所有的中间临时文件都被销毁了,导致临时文件的生命周期延长,并带有悬垂的引用/指针。
我相信这个问题会变得更加相关,因为我们有可用的右值引用,而不仅仅是 const 引用。
所以我的问题是,为什么会这样?是否没有用于延长相关右值生命周期的用例?或者这背后有深思熟虑?
这是我的意思的一个例子:
#include <iostream>
struct Y
{
Y() { std::cout << " Y construct\n"; }
~Y() { std::cout << " Y destruct\n"; }
};
struct X
{
Y&& y;
X(Y&& y)
: y( (std::cout << " X construct\n",
std::move(y)) ) {}
~X() { std::cout << " X destruct\n"; }
operator Y&() { return y; }
};
void use(Y& y)
{
std::cout << " use\n";
}
int main()
{
std::cout << "used within fn call\n";
use(X(Y()));
std::cout << "\nused via life extention\n";
auto&& x = X(Y());
use(x);
}
输出:
used within fn call Y construct X construct use X destruct Y destructused via life extention Y construct X construct Y destruct use X destruct
最佳答案
生命周期延长规则旨在:
否则,生命周期延长会产生运行时成本,指针或引用的每次初始化都必须增加与临时对象关联的引用计数。如果这是您想要的,请使用 std::shared_ptr
。
在您的示例中,X::X(Y&&)
构造函数可以在另一个翻译单元中定义,因此编译器甚至可能无法在翻译时告诉它 存储 对传入的临时对象的引用。程序不应该根据函数是在这个翻译单元还是另一个翻译单元中定义而表现不同。即使编译器可以看到 X::X
的定义,原则上 X::y
的初始化程序也可能是一个任意复杂的表达式,它可能会或可能不会实际产生在 xvalue 中引用与参数 y
相同的对象。尝试决定潜在的不可决定的决策问题不是编译器的工作,即使在对人类显而易见的特殊情况下也是如此。
关于c++ - 为什么延长临时对象的生命周期不会导致中间临时对象的延长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47371928/
我有一个网站,用户可以在其中提交游戏报告。我目前结合使用 markdown 和 HTMLPurifier 来允许有限的标记。 我想添加内联照片支持,从用户图库中绘制图像。 我用一些 JS 构建了一个图
Name = (src.Client.Account.Rank > 65 ? src.Client.Account.Rank > 2 ? "$" : "@" : "") + src.Name, 这
在下面的例子中: http://coliru.stacked-crooked.com/a/7a1df22bb73f6030 struct D{ int i; auto test2
有没有办法延长 Firebase SMS 的过期时间?似乎只有一分钟左右有效,有时需要比这更长的时间才能收到短信。 更新:我正在通过 Web API 发送短信 最佳答案 将此视为目前的最新答案,今天已
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我正在绘制相同的 密度图 使用 基础绘图系统和 ggplot2 . 中的密度图基础绘图系统有光滑的尾部: d = density(iris$Sepal.Length) plot(d) 中的密度图ggp
大家好,我认识的每个人都问这个问题很基础而且很愚蠢,但这个问题让我很烦。如果我有以下代码。 var timerVal = 900000 function myFunction() { setTim
当我在 Rust 0.12.0 中编译以下代码时,出现以下错误: error: borrowed value does not live long enough let _ = match re.ca
我正在尝试将一个系列解析为 token 树,但是当我尝试实现我的解析特征时,我收到了与引用生命周期相关的错误。我认为创建一个盒装版本可以解决任何与引用计数或生命周期有关的问题。代码如下。 impl P
当我在 Rust 0.12.0 中编译以下代码时,出现以下错误: error: borrowed value does not live long enough let _ = match re.ca
我在方法中有以下代码: int64_t delayInSeconds = 2.0f; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
当我按下主页按钮时,我的应用程序正确暂停,但只持续几分钟。如果我离开它一会儿然后返回它,应用程序会重新启动。 我没有在我的应用程序中运行任何后台任务,其他应用程序保持暂停状态的时间比我的要长得多。 这
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我需要服务停止足够长的时间。大约 5-10 分钟。现在在 Windows 10 上,我的服务系统在 60 秒后终止,而没有等待它正确完成。使用网络函数 RequestAdditionalTime 看到
如何延长windows app证书的有效期?我们正在加载应用程序/主要障碍是证书每年都会过期,通过 GP 更新证书很麻烦,因为我们的环境中已经存在问题。我们希望将其延长至少 5 年。 我设法找到了关于
最近我看到了这个: 在 2037 年之前,我的任何应用都不太可能存活(而且我存活了下来,所有依赖它的东西都存活了),我的应用是否会因为需要新证书而必须使用新的包名称重新发布? 没有办法延长证书吗? 最
有什么方法可以延长 keystore 或证书的时间有效性吗? 我已经创建了一个有效期为 10 年的 keystore 。但是,由于谷歌市场的限制,我需要 30 年的有效期。 最佳答案 证书有效性是证书
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SSC
我 3 天前注册了 30 天的 Azure 试用版。我有 2 个虚拟机。今天,我的管理门户中弹出 2 条消息。 您的免费试用将在 25 天后到期。单击此处立即升级。 根据您的使用历史记录(21.52
我是一名优秀的程序员,十分优秀!