C++ 依赖确定性破坏,避免返回时的破坏
我一直在努力修改我的日志类。然而,我面临一个问题。C++ 依赖确定性破坏,避免返回时的破坏,c++,c++14,C++,C++14,我一直在努力修改我的日志类。然而,我面临一个问题。 我想向用户公开此界面: mylog() << "hello"; 有趣的是,通过这段代码,我发现我以前的实现依赖于RVO。编译器总是执行复制省略,因此析构函数的行为符合我的要求。但是,对于这段代码,换行符将被打印两次,因为在operator() 当我不返回临时实例,而是将其放入操作符()的主体中时,问题就消失了: LogStream stream; stream << "message: "; return stream
我想向用户公开此界面:
mylog() << "hello";
有趣的是,通过这段代码,我发现我以前的实现依赖于RVO。编译器总是执行复制省略,因此析构函数的行为符合我的要求。但是,对于这段代码,换行符将被打印两次,因为在operator()
当我不返回临时实例,而是将其放入
操作符()
的主体中时,问题就消失了:
LogStream stream;
stream << "message: ";
return stream;
LogStream;
stream向LogStream
添加一个构造函数,该构造函数接受字符常量*
LogStream(char const* c) { std::cout << c; }
这样就避免了临时线路和额外的新线路
(请注意,即使使用-fno elide构造函数来禁用复制省略,也不会导致额外的换行)。在日志流中添加一个标志来指示是否需要在析构函数中输出换行,并在移动(在移动的对象上)时将该标志设置为false。这将起作用,可能是最简单的解决方案,但我不是它的粉丝。我宁愿删除复制构造函数。@Asu,如果您不能使用Holt的建议,您可能需要使用C++17标准进行编译,其中RVO不是“可能”或“可能”的情况(在某些上下文中,如您的代码段),复制构造函数被删除,只有移动构造函数不被删除。对,这似乎有效,尽管我更喜欢不使用移动构造函数的解决方案。Praetorian的解决方案在我看来相当不错:)编辑:另外,我知道C++17在某些情况下提供了保证的省略,尽管我在这个项目中坚持使用C++14,至少现在是这样。
LogStream(char const* c) { std::cout << c; }
LogStream operator()()
{
return {"message: "};
}