【问题标题】:Who is failing, boost, clang, or gcc? Issue with std::chrono used with boost::asio谁在失败、boost、clang 或 gcc?与 boost::asio 一起使用的 std::chrono 问题
【发布时间】:2015-02-17 13:29:11
【问题描述】:

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。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    chrono documentation 对此进行了描述

    自动启用对 std::chrono 工具的支持 g++ 4.6 及更高版本,当 -std=c++0x 或 -std=gnu++0x 编译器 使用选项。 (请注意,对于 g++,标准草案 monotonic_clock 用于代替 stable_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
    

    不知道其他boost库中是否有优先支持clang这样的东西,请file a bug

    【讨论】:

    • 已提交错误(作为功能请求)。
    • @ilektron,你有链接到你创建/发现方便的请求吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多