首页 > 解决方案 > 返回右值引用

问题描述

我看过其他有关此的帖子,但对此我仍然感到有些困惑。

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吗?

如果有人能澄清这些,我将不胜感激。

标签: c++rvalue-reference

解决方案


但是,没有来自 clang 或 g++ 的警告,也许我错过了什么?

您唯一缺少的是编译器不能保证也不需要警告未定义的行为,并且通常无法这样做。

这毕竟不是UB吗?

程序的行为未定义的。缺乏警告并不能证明明确的行为。


对于它的价值,GCC 和 Clang 都在运行时使用 AddressSanitizer 检测到这个错误。


推荐阅读