Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 依赖确定性破坏,避免返回时的破坏_C++_C++14 - Fatal编程技术网

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: "};
}