Fru*_*nsi 37 c++ temporary c++-faq lifetime full-expression
以下代码工作正常,但为什么这是正确的代码?为什么foo()返回的临时的"c_str()"指针有效?我想,当输入bar()时,这个临时性已经被破坏了 - 但它似乎不是这样的.那么,现在我假设foo()返回的临时值将在调用bar()之后被销毁 - 这是正确的吗?为什么?
std::string foo() {
std::string out = something...;
return out;
}
void bar( const char* ccp ) {
// do something with the string..
}
bar( foo().c_str() );
Run Code Online (Sandbox Code Playgroud)
fre*_*low 64
当词汇包含rvalue的完整表达式时,将销毁临时对象,该rvalue的评估创建了对临时对象的完全评估.让我用ASCII艺术演示:
____________________ full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
^^^^^ ^
| |
birth funeral
Run Code Online (Sandbox Code Playgroud)
Chu*_*dad 45
$ 12.2/3-"作为评估全表达式(1.9)的最后一步,(词法上)包含创建它们的点,临时对象被销毁.即使该评估以抛出异常结束,也是如此."
foo()返回的临时值的生命周期一直延续到创建它的完整表达式的末尾,即直到函数调用"bar"结束.
编辑2:
$ 1.9/12-"完整表达式是一个表达式,它不是另一个表达式的子表达式.如果定义了一个语言结构来产生一个函数的隐式调用,那么语言结构的使用被认为是一个表达式.这个定义的目的."
归档时间: |
|
查看次数: |
3149 次 |
最近记录: |