我有以下类声明:
class A {
public:
A();
private:
boost::asio::io_service io;
boost::asio::deadline_timer t;
};
类A
的以下构造函数可以正常工作:
A::A() : t(io) {
// do stuff
}
但是当我写这篇文章时:
A::A() {
t(io);
// do stuff
}
我收到以下错误:
错误:无法调用'(boost :: asio :: deadline_timer {aka 提高:: ASIO :: basic_deadline_timer}) (升压:: ASIO :: io_service对象&安培;)
也许是因为boost::asio::deadline_timer
的复制构造函数未定义。但是在成员初始化列表的情况下发生了什么?它不使用复制构造函数吗?
关于成员初始化列表中使用的机制与在类构造函数中使用赋值/复制构造函数的时间相比,我的问题可能会更加通用。
答案 0 :(得分:2)
该问题与复制构造函数无关,您根本没有调用它。关键是两个t(io)
不是一回事。
t(io)
表示构造函数以t
为参数构造io
。 (我假设boost::asio::deadline_timer
有一个以boost::asio::io_service
为参数的构造函数。)
t(io)
是一个语句,意味着调用t
作为函子,传递io
作为参数。它失败了,因为boost::asio::deadline_timer
不支持这种仿函数行为。
答案 1 :(得分:0)
我想我能回答我的问题。引用cppreference:
在形成函数体的复合语句之前 构造函数开始执行,初始化所有直接碱基, 虚拟基础和非静态数据成员完成。会员 初始化列表是非默认初始化的地方 可以指定这些对象。对于不能成员 default-initialized,例如reference和const-qualified成员 类型,必须指定成员初始值设定项。
所以在我的例子中,没有定义boost :: asio :: deadline_timer的拷贝构造函数。因此,我需要在初始化列表中构建它。