Subject: [Boost-bugs] [Boost C++ Libraries] #13518: Default constructor is explicit, no reason to be.
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2018-04-13 11:15:00
#13518: Default constructor is explicit, no reason to be.
------------------------------+-----------------------------------
Reporter: anonymous | Owner: JoaquÃn M López Muñoz
Type: Bugs | Status: new
Milestone: To Be Determined | Component: multi_index
Version: Boost 1.66.0 | Severity: Problem
Keywords: |
------------------------------+-----------------------------------
See the follwing code
{{{#!c++
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/identity.hpp>
using namespace std;
struct aggregate {
boost::multi_index_container<int> a;
};
int main()
{
using boost::multi_index_container;
multi_index_container<int> a; // default init
// multi_index_container<int> b(); // NOT A THING, not object init
multi_index_container<int> c =
multi_index_container<int>(); //value init + (elided) copy
auto d = multi_index_container<int>(); // value init + (elided)
copy
multi_index_container<int> e{}; // direct-list-init, chooses value
init
auto f = multi_index_container<int>{};
// direct-list-init, chooses value init
// followed by elided copy
multi_index_container<int> g = {}; // ERROR
// copy-list-init, should choose value init
// but fails becase default constructor is explicit
aggregate agg1{}; // ERROR for the same reason above
aggregate agg2 = {}; // ERROR for the same reason above
// Does aggregate init which does copy-list-init on members that
// were not specified in the list.
auto agg3 = aggregate(); //OK, value init
multi_index_container<int> h{1, 2, 3, 4};
// direct-list-init, chooses initializer list
multi_index_container<int> i = {1, 2, 3, 4};
// copy-list-init, chooses initializer list
return 0;
}
}}}
The problematic ctor is in line 175 of multi_index_container.hpp
{{{#!c++
explicit multi_index_container(
#if BOOST_WORKAROUND(__IBMCPP__,<=600)
/* VisualAge seems to have an ETI issue with the default values
* for arguments args_list and al.
*/
const ctor_args_list& args_list=
typename mpl::identity<multi_index_container>::type::
ctor_args_list(),
const allocator_type& al=
typename mpl::identity<multi_index_container>::type::
allocator_type()):
#else
const ctor_args_list& args_list=ctor_args_list(),
const allocator_type& al=allocator_type()):
#endif
bfm_allocator(al),
super(args_list,bfm_allocator::member),
node_count(0)
{
BOOST_MULTI_INDEX_CHECK_INVARIANT;
}
}}}
Probably, it was made explicit for the case when it is called with non-
default parameters.
-- Ticket URL: <https://svn.boost.org/trac10/ticket/13518> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2018-04-13 11:22:08 UTC