返回右值引用
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 检测到此错误。
我看过其他关于此的帖子,但我对此仍然有些困惑。
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 检测到此错误。