不能。 C++的<<其实是函数调用的语法糖,它实际上等于调用了ostream.operator<<()。 普通的函数是无法链式调用的,因此C++强制要求ostream.operator<<返回另一个ostream。换句话说<<的函数原型是: ostream ostream.operator<<(std::string s); 它的执行过程其实是: ostream tempStream; tempStream = std::cout.operator<<(a); tempStream = tempStream.operator<<(b); tempStream = tempStream.operator<<(c); tempStream = tempStream.operator<<('\n'); 这显然不可能是原子的。 大致看了下std::osyncstream的文档: 从文档描述看,它可能使用了scope_guard的实现思路。 也就是说,它的每次<<调用仍然不是原子的;但数据会在内部缓存、不会真的写出去。直到局部变量作用域结束、临时对象被销毁时,才会一次性的、原子的把之前缓存的信息写出去。 这在效果上,可以确保字符输出是原子的;但另一方面,如果用这个做日志的话,尤其是具名变量方式使用,它会导致日志延迟输出(不出作用域不会写盘)。这在一些要求严格的日志应用场景是不可接受的(比如银行之类、要求每个步骤严格落实到磁盘)。 而临时变量方式会好得多。因为它会在不再使用时第一时间被析构。 换句话说,它会在这行代码的分号处析构: std::osyncstream(std::cout) << "Hello, " << "World!" << '\n'; 这个行为显然更符合预期。 |
|