【发布时间】:2016-06-05 10:39:43
【问题描述】:
好的,我有这个事件序列:
- 我构造了一个右值对象
- 我将一个迭代器作为参数传递给该 r 值对象到函数中
- 函数在这个迭代器上运行
- 函数按值返回此迭代器
- 我取消引用迭代器
我不知道是什么原因导致清除右值对象,是该行的终止吗?
好的,现在具体来说,我正在尝试为这个问题想出一个更好的答案:string Multiplication in C++ 我有代码:
const auto bar = 13U;
const char multiplicand[] = "0, ";
const auto length = strlen(multiplicand);
const string foo(&*generate_n(string(bar * length, '\0').begin(), bar * length, [&]() {
static auto i = 0U;
return multiplicand[i++ % length];
}) - bar * length);
所以我想知道在 generate_n 内部构造的 string 何时应该被销毁。 顺便说一下,这似乎在 gcc 5.1 上运行良好:http://ideone.com/Y8rDs5 但我可能只是不确定行为。 Visual Studio 2015 上的代码段错误这一事实暗示了这一点。
【问题讨论】:
-
this 不回答这个关于生命周期的问题吗?
-
@NathanOliver 确实如此,说:“通常这意味着它在
;(或)、for、if、while、switch等)结束表示语句的结束。在你的例子中,它是函数调用的结束。”我认为)是我问题的答案。但该声明中的“通常”并不是确定的。如果清理应该推迟到;,那么我很幸运,但这意味着微软做错了...... -
我不知道这段代码是否调用了 UB,但它不是任何东西的更好答案。
-
@n.m.大声笑,也许:stackoverflow.com/q/35506712/2642059 可以从你的一些智慧中受益?如果我可以进行字符串乘法来初始化
const string,我会非常兴奋,老实说,即使它很丑,我也会很兴奋。 -
从函数中按值返回
std::string。编译器知道如何优化它。
标签: c++ iterator arguments lifetime-scoping object-destruction