【问题标题】:When exactly are function arguments being destructed?函数参数究竟是什么时候被破坏的?
【发布时间】:2021-08-03 20:32:37
【问题描述】:

我有一个问题,因为我不清楚函数参数何时被破坏。因此,以下 doSomething 函数的串联是否容易出错?

我问是因为“程序员有责任确保 std::string_view 不会超过指向的字符数组”。在特定情况下是否可以保证?

#include <string>
#include <string_view>

std::string doSomething(const std::string_view& str_view)
{
    // do something and create a new std::string instance based on the std::string_view instance

    return str;
}

int main()
{
    std::string input_str{"Hello world!"};

    std::string output_str{ doSomething(doSomething(doSomething(input_str))) };

    return 0;
}

【问题讨论】:

  • 好吧,你返回std::string,反正它不依赖于std::string_view。
  • 在这种情况下,指向的字符数组是input_str.data(),它一直存在到main 返回,它肯定比任何最后一个str_view 参数都长。
  • @NathanOliver 这个问题似乎是针对函数参数而不是函数参数。

标签: c++ arguments c++17 destructor string-view


【解决方案1】:

传递给(const 参考)参数const std::string_view&amp; str_view 的匿名临时在函数调用中继续存在。

由于存在嵌套函数,匿名临时对象不会被销毁,直到概念上的结束分号

std::string output_str{ doSomething(doSomething(doSomething(input_str))) };

【讨论】:

  • 我是否理解正确,所有用作函数参数的 std::string 不仅会在函数调用开始时作为临时对象存在(以构造 std::string_view 的)?这意味着,它们至少会在函数体完全执行之前存在?
  • @D3V0N5H1R3:没错。在您到达; 之前,不会破坏std::strings。并且它们以与构造相反的顺序被销毁。
  • 顺便说一句,将 const& 放在 string_view 上是否有任何好处?我的印象是“不”。
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多