类Logger是可复制和可移动的,这有意义吗?
Does it make sense for a class Logger to be copyable and movable?
我最近在这里问了很多问题。我在考虑语义学。
没有使复制或移动它变得困难,事实上它只有一个成员函数log(),没有数据成员(可能将来)。但在我看来,这种类型的对象是可复制和可移动的,这在逻辑上似乎是不正确的。
如果您计划在整个过程中只有一个登录,那么使用静态对象,不需要复制和删除对象
如果您计划使用有限数量的对象(例如每个日志级别一个),并且这些对象很重(大缓冲区,odbc连接),那么值得使用可移动和可复制的类。
但是,你不能在可复制的类中使用互斥锁,因为互斥锁是不可复制的。
简短的回答:日志记录器有点像输出流,所以与流一样。可移动但不可复制
长答案:这分为两个决定,每个决定分为两个部分:
- 我是否应该使记录器接口满足这种类型,保证可复制和可移动?
未来的日志类型可预见地将包含流或互斥锁,这意味着接口不应该保证可复制,因为这些东西是不可复制的。一个日志记录器的vector
可能是有意义的,所以让日志记录器可移动并不是完全没有意义,只要你没有看到不这样做的具体理由。
- 我应该让这个类可复制和可移动吗?
这可能无关紧要,除非你说你计划在将来添加数据成员。也就是说,您将修改这个日志记录器类,而不是编写新的日志记录器类,这些日志记录器类满足相同的基本接口,但使用不同的日志消息接收器。如果您确定这是明智的,那么出于这个原因,同样的考虑也适用于这个类和接口:不要使它可复制。
相关文章:
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 为什么协程的返回类型必须是可移动构造的?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 从头开始为应用程序创建 docker 映像是否有意义?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 将可选与reference_wrapper相结合是否有意义?
- constexpr移动构造函数是否有意义
- 具有多个非可选参数的转换构造函数是什么样子的?为什么它有意义
- 使用可移动节点创建有向图(使用 QT / Boost)
- 这就是为什么 C++ 11 中的移动构造函数有意义
- 对运算符+和/或运算符+=使用移动语义有意义吗
- 通过在移动赋值运算符中使用std::swap来重用析构函数逻辑有意义吗
- 如何从任何可调用的函数中获得有意义的函数签名
- 为什么代码需要有一个可访问的复制/移动构造函数,即使允许发生复制-省略
- 是否有任何库可以确定数值是否可以转换为特定字符集中的有效、可打印且有意义的字符
- 错误到底是什么,对于错误地调用可移动和不可复制成员的复制构造函数有什么解决方法
- 这个可移动类型对于 std::map 有什么问题?
- 类Logger是可复制和可移动的,这有意义吗?