Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 临时人员的寿命_C++_Temporary_C++ Faq_Lifetime_Full Expression - Fatal编程技术网

C++ 临时人员的寿命

C++ 临时人员的寿命,c++,temporary,c++-faq,lifetime,full-expression,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 somethin

下面的代码工作正常,但为什么这是正确的代码?为什么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() );
$12.2/3-“临时物品 最后一步被摧毁 计算完整表达式(1.9) 这(从词汇上)包含了这一点 这是真的 即使那次评估以失败告终 正在引发异常。”

foo()返回的临时表达式的生存期将一直延长到创建它的完整表达式的结尾,即直到函数调用“bar”的结尾

编辑2:

$1.9/12-“完整表达式是 不是子表达式的表达式 指另一种表达。如果一种语言 构造被定义为生成 隐式调用函数,使用 考虑了语言结构 作为目的的表达 这是定义的一部分。”


当在词汇上包含其计算创建临时对象的右值的完整表达式被完全计算时,临时对象将被销毁。让我用ASCII艺术来演示:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral

ASCII art:)中的隐喻性插图非常具有说明性。我真的很喜欢它们还注意到
c_str()
只返回一个临时指针。它的生存期并不表示它所指向的数据的生存期。
c_str()
根本不返回临时值。它返回指针类型的右值。指针类型的R值不是对象。他们没有生命。