1

我有以下类声明:

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 boost::asio::basic_deadline_timer}) (boost::asio::io_service&)

boost::asio::deadline_timer也许是因为未定义复制构造函数。但是在成员初始化列表的情况下会发生什么?它不使用复制构造函数吗?

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

4

2 回答 2

2

该问题与复制构造函数无关,您根本没有调用它。关键是这两个t(io)s 不是一回事。

t(io)在成员初始化列表中表示t由构造函数io作为其参数构造。(我想boost::asio::deadline_timer有一个构造函数boost::asio::io_service作为参数。)

t(io)在构造函数的主体中是一个语句,表示t作为函子调用,io作为其参数传递。它失败是因为boost::asio::deadline_timer不支持这种仿函数行为。

于 2016-09-02T09:25:50.740 回答
0

我想我的问题有了答案。引用cppreference

在构成构造函数的函数体的复合语句开始执行之前,所有直接基、虚拟基和非静态数据成员的初始化都已完成。成员初始化器列表是可以指定这些对象的非默认初始化的地方。对于不能默认初始化的成员,例如引用和 const 限定类型的成员,必须指定成员初始化器。

所以在我的例子中, boost::asio::deadline_timer 的复制构造函数没有定义。因此我需要在初始化列表中构造它。

于 2016-09-02T09:25:40.350 回答