Boost logo

Boost :

Subject: Re: [boost] [thread] call_once regression or it is planed so?
From: Peter Dimov (lists_at_[hidden])
Date: 2013-06-04 12:13:11


Antony Polukhin wrote:
> Hi,
>
> With 1.54.0_beta1 following code fails to compile:
>
> #include <boost/thread/once.hpp>
> void init_host(int);
> void init_host();
> boost::once_flag instance_flag = BOOST_ONCE_INIT;
>
> int main() {
> boost::call_once(&init_host, instance_flag);
> }
>
> In 1.53 it worked fine.
>
> Is that meant to be so and no workaround is possible, or is it a bug?

This is not guaranteed to work by the specification of std::call_once and
boost::call_once. It has worked before because, I assume, it used
boost::bind under the covers, and boost::bind does limited overload
resolution based on the number of arguments. The usual workaround is

int main() {
    void (*pf)() = init_host;
    boost::call_once( instance_flag, pf );
}

or the equivalent formulation with a static_cast. If you have lambdas, []{
init_host(); } should work too.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk