为std :: function分配一个仿函数时,为什么不调用构造函数?

时间:2017-03-18 10:24:16

标签: c++ most-vexing-parse

我不明白使用functor和std :: function对下面的代码会发生什么。

我的解释与代码交错(连接的代码是可编译的)。

#include <chrono>
#include <functional>

class O
{
public:
    void func();
};

O类有一个func - 方法来做某事。

class FunctorClass
{
    O &o_;
    FunctorClass(O &o)
        : o_(o) {}

    std::chrono::milliseconds operator()()
    {
        o_.func();
        return std::chrono::seconds(1);
    }
};

FunctorClass接受O对象的引用,并声明operator(),它返回一个间隔并调用成员func的{​​{1}}。

o_

class TaskLoop { std::function<std::chrono::milliseconds(void)> task_; public: TaskLoop(std::function<std::chrono::milliseconds(void)> t) : task_(t) {} }; 正在启动一个线程并调用TaskLoop并在此调用返回的时间间隔内休眠。 (如果有的话,在这里省略了线程处理)

task_

在main函数中,我创建了一个int main(void) { O o; TaskLoop loop(FunctorClass(o)); getchar(); // just to have the process waiting return 0; } 的对象。在创建O - 对象时,我认为我创建了一个loop - 对象,它本身以FunctorClass为参数。

但这不会发生。 FunctorClass的构造函数是私有的。

此代码使用两个不同版本的GCC(4.8和6.x)编译而没有相关警告。

会发生什么?编译器正在优化,但为什么?

对于冗长的代码感到抱歉,这已经是一个简化的测试用例。

PS:使用o / new执行此操作时,我会收到必要的编译器警告和错误:

shared_ptr

0 个答案:

没有答案