在返回之前是否销毁参数
Does Destruction of Arguments Occur Prior to Return?
好的,我有这样的事件序列:
- 我构造一个 r 值对象
- 我将该 r 值对象的迭代器作为参数传递到函数中
- 该函数在此迭代器上运行
- 该函数按值返回此迭代器
- 我取消引用迭代器
我不知道是什么原因导致清理r值对象,是那行的终止吗?
好的,现在具体来说,我试图为这个问题想出一个更好的答案:字符串乘法 C++ 我有代码:
const auto bar = 13U;
const char multiplicand[] = "0, ";
const auto length = strlen(multiplicand);
const string foo(&*generate_n(string(bar * length, ' ').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上的代码段错误这一事实暗示了这一点。
临时表达式(如 string(bar * length, ' ')
)在完整表达式结束时被销毁。完整的表达式是 const string foo
的初始值设定项。因此,在 foo
的 ctor 返回之前,不会销毁临时字符串。
相关文章:
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 如何检查给定的参数是否为 cv::noArray()?
- 如果返回 -1,时间() 的参数是否被修改?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 检查两个模板参数是否相同
- 空函数的参数是否加载到缓存中?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 了解'this'或其他参数是否为右值
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- shared_ptr构造函数参数是否应按值传递
- 如何检查模板参数是否为给定值?
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 通过 ssh 发送参数.是否有非阻塞输入函数?
- 如何检查运算符 != 模板参数是否存在 C++ 17?
- 常量引用函数参数:是否可以禁止临时对象?
- 如何检查模板参数是否为 std::variant?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 移动 l 值参考参数是否是一种不好的做法?
- 显式指定通用 lambda 的 operator() 模板参数是否合法?