谁失败,提升,铿锵或者gcc?与boost :: asio一起使用的std :: chrono问题

时间:2014-12-18 17:10:26

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

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);

1 个答案:

答案 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来实现这一点
clang++ -D BOOST_ASIO_HAS_STD_CHRONO -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono

我不知道在其他推文库中是否有优先支持clang这样的内容,请file a bug