返回右值引用

Returning rvalue references

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

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

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

However, no warning from clang or g++, perhaps I am missing something?

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

Is this not UB after all?

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


就其价值而言,GCC 和 Clang 都在运行时使用 AddressSanitizer 检测到此错误。