C++11 谁在失败,谁在助推,谁在叮当,谁在gcc?与boost::asio一起使用的std::chrono存在问题

C++11 谁在失败,谁在助推,谁在叮当,谁在gcc?与boost::asio一起使用的std::chrono存在问题,c++11,boost,clang,boost-asio,C++11,Boost,Clang,Boost Asio,如所述,boost::asio现在可以使用C++11 chrono对象(如果可用)。但是,以下代码使用clang 3.6.0-svn22366-1~exp1编译,而不是使用clang 3.6.0-svn22366-1~exp1编译 #include <iostream> #include <boost/chrono.hpp> #include <boost/bind.hpp> #include <boost/asio.hpp> #include &

如所述,boost::asio现在可以使用C++11 chrono对象(如果可用)。但是,以下代码使用clang 3.6.0-svn22366-1~exp1编译,而不是使用clang 3.6.0-svn22366-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和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.
~/scratch$clang++-3.6-std=c++11测试\u asio\u chrono\u break.cpp-lpthread-lboost\u系统-lboost\u chrono
test\u asio\u chrono\u已断开。cpp:23:8:错误:没有匹配的成员函数用于调用“expires\u from\u now”
timer.expires_from_now(标准::计时::毫秒(10));
~~~~~~^~~~~~~~~~~~~~~~
/usr/include/boost/asio/basic_waitable_timer.hpp:414:15:注意:候选函数不可行:第一个参数没有从“std::chrono::millides”(又名“duration”)到“const duration”(又名“const duration”)的已知转换
标准::从现在起大小过期(持续时间和过期时间)
^
/usr/include/boost/asio/basic_waitable_timer.hpp:387:12:注意:候选函数不可行:需要0个参数,但提供了1个
持续时间从\u now()常量到期
^
/usr/include/boost/asio/basic_waitable_timer.hpp:445:15:注意:候选函数不可行:需要2个参数,但提供了1个
标准::大小从现在起过期(持续时间和过期时间,
^
生成1个错误。
asio正在尝试使用boost::chrono而不是std::chrono

谁错在这里?我猜boost应该受到责备,因为它有特殊的GCC#ifdef标志用于捕获c++11和std::chrono,但是那些#ifdef没有捕获使用clang时可以使用的std::chrono。我应该向谁报告这个问题

我可以通过显式定义计时器类型来修复代码(在添加automagic std::chrono检测之前,旧版本的boost需要这样做)

typedef boost::asio::basic_waitable_timer<std::chrono::steady_clock> steady_timer;
steady_timer timer(ioservice);
typedef boost::asio::basic_waitable_timer station_timer;
稳定定时器(ioservice);
说明了这一点

对std::chrono设施的支持将自动为 当-std=c++0x或-std=gnu++0x编译器 使用选项。(注意,对于g++,标准草案 使用单调时钟代替稳定时钟。)可能需要支持 通过明确定义BOOST\u ASIO\u DISABLE\u STD\u CHRONO或禁用 通过定义BOOST\u ASIO\u HAS\u STD\u CHRONO为其他编译器启用

我还特别强调了这一点。也就是说,通过显式定义
BOOST\u ASIO\u HAS\u STD\u CHRONO

clang++ -D BOOST_ASIO_HAS_STD_CHRONO -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono

我不知道在其他boost库中是否有类似的东西,请。

Bug文件(作为功能请求)。@ilektron,你有你创建/发现的请求的链接吗?
clang++ -D BOOST_ASIO_HAS_STD_CHRONO -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono