我很久以前就回到了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;
}
答案 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{};