Opened 8 years ago
Closed 8 years ago
#10844 closed Bugs (fixed)
flyweight: multiple default constructors with real perfect forwarding
| Reported by: | Owned by: | Joaquín M López Muñoz | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | flyweight |
| Version: | Boost 1.57.0 | Severity: | Cosmetic |
| Keywords: | Cc: |
Description
Flyweight gets two default constructors, since it has a direct default constructor
flyweight():h(core::insert()){}
and one based on variable template arguments, which can be zero.
#define BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY(args) \
:h(core::insert(BOOST_FLYWEIGHT_FORWARD(args))){}
BOOST_FLYWEIGHT_PERFECT_FWD_WITH_ARGS(
explicit flyweight,
BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY)
#undef BOOST_FLYWEIGHT_PERFECT_FWD_CTR_BODY
which can expand to:
template<typename... Args>
explicit flyweight(Args&&... args)
:h(core::insert(std::forward<Args>(args)...)){}
Change History (9)
follow-up: 2 comment:1 by , 8 years ago
comment:2 by , 8 years ago
Replying to joaquin:
As far as I understand C++ rules, this should not raise any kind of ambiguity as the default ctor should be preferred over the templated ctor (called with no args). Are you having warnings with some compiler?
I get warnings from MS Visual Studio 2013.
You are probably right in that the default ctor is preferred. It's probably just a cosmetic warning.
follow-up: 4 comment:3 by , 8 years ago
OK, I'll fix it then tonight if I have a moment to spare. Can I count on your support to verify that the warning goes away after I do the commit?
comment:4 by , 8 years ago
Replying to joaquin:
OK, I'll fix it then tonight if I have a moment to spare. Can I count on your support to verify that the warning goes away after I do the commit?
Sure :)
comment:5 by , 8 years ago
Here you are:
https://github.com/boostorg/flyweight/commit/8f5bbd5d57780fd33e3b527a3d406e14a4d0fd9d
Could you please report back if the warning is gone?
comment:6 by , 8 years ago
I've decided to revert the previous fix as it changes (theoretically at least) boost::flyweight public interface, and used #pragma warning(disable:4520) instead:
https://github.com/boostorg/flyweight/commit/095dcfb812ab8670af70912419e129d9ad656927
Can you check this works also? Thank you.
comment:9 by , 8 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |

As far as I understand C++ rules, this should not raise any kind of ambiguity as the default ctor should be preferred over the templated ctor (called with no args). Are you having warnings with some compiler?