如this question所述,boost :: asio现在可以使用C ++ 11 chrono对象(如果可用)。但是,以下代码编译但不符合clang 3.6.0-svn223366-1~exp1
#include <iostream>
#include <boost/chrono.hpp>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <thread>
#include <functional>
boost::asio::io_service ioservice;
boost::asio::steady_timer timer(ioservice);
void function()
{
std::cout << "Success" << std::endl;
}
int main()
{
std::thread t([&]{ ioservice.run(); });
t.detach();
timer.expires_from_now(std::chrono::milliseconds(10));
timer.async_wait(boost::bind(&function));
std::this_thread::sleep_for(std::chrono::seconds(1));
}
GCC
~/scratch$ g++ -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono
~/scratch$ ./a.out
Success
gcc和boost很高兴使用std :: chrono
然而,铿锵:
~/scratch$ clang++-3.6 -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono
test_asio_chrono_broken.cpp:23:8: error: no matching member function for call to 'expires_from_now'
timer.expires_from_now(std::chrono::milliseconds(10));
~~~~~~^~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_waitable_timer.hpp:414:15: note: candidate function not viable: no known conversion from 'std::chrono::milliseconds' (aka 'duration<int64_t, milli>') to 'const duration' (aka 'const duration<boost::int_least64_t, nano>') for 1st argument
std::size_t expires_from_now(const duration& expiry_time)
^
/usr/include/boost/asio/basic_waitable_timer.hpp:387:12: note: candidate function not viable: requires 0 arguments, but 1 was provided
duration expires_from_now() const
^
/usr/include/boost/asio/basic_waitable_timer.hpp:445:15: note: candidate function not viable: requires 2 arguments, but 1 was provided
std::size_t expires_from_now(const duration& expiry_time,
^
1 error generated.
boost :: asio试图使用boost :: chrono而不是std :: chrono。
谁在这里有错?我猜这种提升是值得责备的,因为它有特殊的GCC #ifdef标志用于捕获c ++ 11和std :: chrono,但是那些#ifdef并没有抓住std :: chrono在使用clang时可用。我向谁报告此问题?
我可以通过显式定义计时器类型来修复代码(在添加自动std :: chrono检测之前,旧版本的boost需要)。以下更改将在gcc和clang上编译
typedef boost::asio::basic_waitable_timer<std::chrono::steady_clock> steady_timer;
steady_timer timer(ioservice);
答案 0 :(得分:9)
chrono documentation描述了这个
自动启用对std :: chrono工具的支持 g ++ 4.6及更高版本,当-std = c ++ 0x或-std = gnu ++ 0x编译器时 使用选项。 (注意,对于g ++,草案标准 使用monotonic_clock代替steady_clock。)支持可能是 通过定义BOOST_ASIO_DISABLE_STD_CHRONO或显式禁用 通过定义BOOST_ASIO_HAS_STD_CHRONO来启用其他编译器。
增加了重点是我的。也就是说,您可以通过明确定义BOOST_ASIO_HAS_STD_CHRONO
clang++ -D BOOST_ASIO_HAS_STD_CHRONO -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono
我不知道在其他推文库中是否有优先支持clang这样的内容,请file a bug。