【发布时间】:2021-10-09 15:18:29
【问题描述】:
我写了一个运算符函数,当出现后缀_f 时返回std::stringstream。
#include <iostream>
#include <sstream>
#include <utility>
static std::stringstream&& operator "" _f(const char* const s, const size_t _) {
return std::move(std::stringstream() << s);
}
int main() {
const auto s = "Number: "_f << 10 << '\n';
std::cout << s.str();
return 0;
}
但是,当我运行它时,我得到一个运行时异常:“访问冲突读取位置...”。
你能告诉我,我的代码哪里出错了吗?
【问题讨论】:
-
你的函数返回一个临时的引用。函数一返回,临时对象就被销毁,调用者尝试使用现在悬空的引用,因此程序表现出未定义的行为。
-
另外,一个人应该很少从一个函数返回引用(而你正是这样做的,而是按值返回)并且一个人几乎不应该
return std::move -
@yeputons C++ 流不能按值传递。它们不支持复制语义,只支持移动语义
标签: c++ c++17 stringstream user-defined-literals