为什么“auto”在这种情况下不起作用?

时间:2014-04-19 05:47:12

标签: c++ c++11 boost boost-asio

我很久以前就回到了c ++,并且同时接受了c ++ 11和boost :: asio。

在GotW #93#94之后,我自然而然地开始使用auto

想象一下,如果不能编译我的失望:

auto io = boost::asio::io_service{};

但我必须改用它:

boost::asio::io_service io{};

为什么第二次编译,但第一次没有?我得到的错误是

Call to implicitly-deleted copy constructor of 'boost::asio::io_service'

boost :: asio :: deadline :: timer表现出相同的行为,但是boost :: posix_time :: seconds不会。

(我正在使用xcode + clang + boost 1_55_0)。

完整的编译示例,从boost asio教程修改:

#include <iostream>
#include <memory>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

namespace asio = boost::asio;

int main(int argc, const char * argv[]) {
    using error_code = const boost::system::error_code;

    asio::io_service io{};
    asio::deadline_timer t{io, boost::posix_time::seconds{2}};

    int count = 0;
    std::function<void (const error_code&)> fn = [&](const error_code& e) {
        if (count < 5) {
            std::cout << "Hello World" << std::endl;
            ++(count);
            t.expires_at(t.expires_at() + boost::posix_time::seconds{1});
            t.async_wait(fn);
        }
    };
    t.async_wait(fn);

    io.run();

    std::cout << "Final count is " << count << std::endl;

    return 0;
}

2 个答案:

答案 0 :(得分:3)

asio::io_service派生自noncopyable,这意味着有意使复制构造函数无法访问。由于同样的原因,这句话不会起作用:

boost::asio::io_service io = boost::asio::io_service{};

在这种情况下,问题不在于auto关键字,而在于缺少对所需构造函数的访问权限。教程代码使用普通的构造函数,它是公共的,所以编译得很好。

答案 1 :(得分:2)

错误非常明显,与auto的使用无关。以下代码将生成类似的错误消息:

struct foo
{
    foo() = default;
    foo(foo const&) = delete;
};

foo f = foo{};

上面的最后一行需要一个可访问的拷贝构造函数(即使编译器省略了副本)。

隐式删除了

boost::asio::io_service的拷贝构造函数,可能是由于存在一个或多个不可复制的数据成员或基类。您已经有了解决错误的正确解决方案:

asio::io_service io{};