谁在失败、助推、叮当或 gcc?std::chrono 与 boost::asio 一起使用的问题



正如这个问题所指出的,boost::asio现在可以使用C++11计时对象(如果可用(。 但是,以下代码使用 clang 3.6.0-svn223366-1~exp1 编译,但不使用 clang 编译

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

海湾合作委员会:

~/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,但那些 #ifdefs 在使用 clang 时没有捕获 std::chrono 可用。 我应该向谁报告此问题?

我可以通过显式定义计时器类型来修复代码(在添加自动魔术 std::chrono 检测之前,旧版本的 boost 需要(。 以下更改将在 gcc 和 clang 上编译

typedef boost::asio::basic_waitable_timer<std::chrono::steady_clock> steady_timer;
steady_timer timer(ioservice);

chrono 文档对此进行了描述

对 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为其他编译器启用

额外的重点是我的。也就是说,您可以通过显式定义 clang 来使用它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 格式,请提交一个错误。

最新更新