2016-02-23 43 views
1

行我有事件序列:在返回之前是否会破坏参数?

  1. 我构造的r值对象
  2. 我通过一个迭代到r值对象到一个函数作为参数
  3. 功能在此操作迭代器
  4. 该函数返回该迭代器值
  5. 我取迭代

我不知道是什么原因导致了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); 

所以我想知道这是建造时string里面的generate_n应该被销毁。顺便说一句,这似乎在gcc 5.1上工作正常:但我可能会得到未定义的行为。这是由以下事实:Visual Studio中的代码段错误2015

+1

不是[this](http://stackoverflow.com/questions/2506793/c-life-span-of-temporary-arguments)回答这个关于一生的问题吗? – NathanOliver

+0

@NathanOliver它的确如此说:“通常这意味着它结束于';'(或')''''''''if','while','switch'等)表示语句结束。在你的例子中,这是函数调用的结束。“我认为'''是我的问题的答案。但是,声明中的“通常”并不是确定性的。如果清理应该推迟到''''那么我是金,但这将意味着微软做错了...... –

+1

我不知道这段代码是否调用UB,但是对它的任何更好的答案不。 –

回答

1

临时变量如string(bar * length, '\0')表达式的结尾被破坏暗示。完整表达式是const string foo的初始值设定项。因此,临时字符串在foo的返回之前不会被销毁。

+0

这就是我从阅读第12.2节的想法。但是,我们的意见不足以支持这个答案。你能给一个源头吗? –

+0

来源确实是12.2。注意这个明显的异常并不适用:“有两种上下文在临时表被销毁在不同于完整表达式结尾的地方,第一个上下文是当表达式作为初始化符出现时,一个对象,在这种情况下,保留表达式结果的临时对象应该一直保持到对象初始化完成“。这不适用,因为它仅适用于临时表达式,而不适用于任何其他临时表达式。 – MSalters

+0

好的,我同意,但那是暂时性的*返回*。 12.2 [class.temporary] 2说了表达式'X b = f(X(2));':“一个实现可能会使用一个临时的构造'X(2)',然后传递给'f() ''使用''X'的拷贝构造函数;或者'X(2)'可能在用于保存参数的空间中构造。“我的问题是,如果参数不通过值,那么用于保存参数的临时/空间何时被清除? –