成员初始化列表与赋值/复制构造函数(在boost deadline_timer中)

时间:2016-09-02 09:11:42

标签: c++ boost member-initialization

我有以下类声明:

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的复制构造函数未定义。但是在成员初始化列表的情况下发生了什么?它不使用复制构造函数吗?

关于成员初始化列表中使用的机制与在类构造函数中使用赋值/复制构造函数的时间相比,我的问题可能会更加通用。

2 个答案:

答案 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的拷贝构造函数。因此,我需要在初始化列表中构建它。