为什么 C++ 在返回本地 std::stringstream 时不使用 RVO?

why doesn't c++ uses RVO when returning local std::stringstream?

本文关键字:RVO stringstream 为什么 返回 std C++      更新时间:2023-10-16

我已经阅读了很多关于 rvalue 和返回 C++>= 11 的局部变量的信息。据我了解,"只是按值返回,不要使用移动/前进,不要在方法签名中添加&&,编译器会为您优化它"。

好的,我希望它发生:

#include <sstream>
std::stringstream GetStream() {
    std::stringstream s("test");
    return s;
}
auto main() -> int {
    auto s = GetStream();
}

我得到好

error: use of deleted function ‘std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)’
     return s;

错误。我不明白,为什么它会尝试复制构造函数?它不是在这里使用移动构造函数和 c++11 中的所有好东西吗?我使用"--std=c++14"。

好的,这是我的 gcc 版本 (4.9.3) 中的一个错误。 似乎在>= 5 中已修复。https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316