c++ - 返回右值引用
问题描述
我看过其他有关此的帖子,但对此我仍然感到有些困惑。
const std::string& func(std::string&& ref) { return ref; }
int main(void) {
const std::string& r=func("E");
std::cout << r << std::endl;
}
现在这在技术上应该是 UB,我正在返回一个"E"
在分配给的表达式完成后应该销毁的引用r
,对吧?但是,没有来自 clang 或 g++ 的警告,也许我错过了什么?
const std::string& func(std::string ref) { return ref; }
int main(void) {
const std::string& r=func("E");
std::cout << r << std::endl;
}
Clang 会警告这样的事情。但是,它没有警告这一点:
const std::string& func(std::string ref) { return std::move(ref); }
int main(void) {
const std::string& r=func("E");
std::cout << r << std::endl;
}
它也不会警告以下内容:
std::string&& func(std::string&& ref) { return std::move(ref); }
int main(void) {
std::string&& r=func("E");
std::cout << r << std::endl;
}
这毕竟不是UB吗?
如果有人能澄清这些,我将不胜感激。
解决方案
但是,没有来自 clang 或 g++ 的警告,也许我错过了什么?
您唯一缺少的是编译器不能保证也不需要警告未定义的行为,并且通常无法这样做。
这毕竟不是UB吗?
程序的行为是未定义的。缺乏警告并不能证明明确的行为。
对于它的价值,GCC 和 Clang 都在运行时使用 AddressSanitizer 检测到这个错误。
推荐阅读
- javascript - 我尝试在 Twitter 集成上通过 ng2-twitter 安装依赖项后出现错误
- sql - 根据日期选择查询
- php - 为特定页面指定 og:image
- sql - SQL Server:如何中途中断 SQL 查询?
- mysql - 在mysql查询中将数字视为零
- python - Python:从线程事件更新 tkinter 画布小部件
- android - android api-26+ 快捷广播接收器未调用
- sql - 如何在 ClickHouse 中自动递增?
- macos - mac high sierra tomat 如何更改8080端口
- angular - Ag-grid 束大小太大