代码之家  ›  专栏  ›  技术社区  ›  tripulse a coder

持有std::ostream rvalue成员时的奇怪行为

  •  -1
  • tripulse a coder  · 技术社区  · 5 年前
    #include <iostream>
    #include <fstream>
    
    class A {
    private:
      std::ostream&& out;  
    public:
        A(std::ostream&& o) : out(std::move(o)) {
            out.write("test", 4);
        }
        
        void writeTest2() {
            out.write("test2", 5);
            out.flush();  // still does nothing.
        }
    };
    
    int main() {
        A a{std::ofstream{"testic"}};
        a.writeTest2();
    }
    

    当上面的代码运行时,它会创建一个名为 testic 一如预期。但是,创建的文件包含 test 但不是 testtest2

    什么时候? std::ostream

    附加信息

    • 编译器尝试: clang gcc
    • 站台上: .
    1 回复  |  直到 5 年前
        1
  •  3
  •   David G    5 年前

    临时的 std::ofstream{"testic"}

    要修复它,可以一起删除引用( && std::ostream&& out std::ostream&& o

    上述方法行不通,因为 std::ostream 无法移动。如果要保持多态性,则必须使用指针。如果这不重要,你可以改变一切 std::ostream&& std::ofstream

    class A {
     private:
      std::unique_ptr<std::ostream> out;
    
     public:
      A(std::unique_ptr<std::ostream> o) : out(std::move(o)) {
        out->write("test", 4);
      }
    
      void writeTest2() {
        out->write("test2", 5);
        out->flush();
      }
    };
    
    int main() {
      A a{std::make_unique<std::ofstream>("testic")};
      a.writeTest2();
    }