This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libstdc++/50641] [c++0x] is_convertible and is_constructible incorrectly require copy constructibility


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50641

--- Comment #4 from Andy Lutomirski <luto at mit dot edu> 2011-10-07 06:57:01 UTC ---
The problem I encountered that inspired this was:

#include <type_traits>
#include <map>

struct From
{
};

struct To
{
  To(const From &&) {}
  To(const To &) = delete;
  void operator = (const To &) = delete;
};

int main()
{
  std::map<int, To> m;
  m.insert(std::pair<int, From>(1, From()));
}

This works in 4.6.0 due to a different bug.  IMO it deserves to work -- the
implementation of map could move-construct the To object in place.  The
standard says explicitly that it's OK for To not to be CopyConstructible and,
indeed, this example works if I add:

To(const To &&) {}

I defer to the experts (and the people who have a copy of the FDIS) to figure
out whether it's supposed to work.  N3242 says that From needs to be
"convertible" to To, but I'm not at all convinced that "convertible" means the
same thing as "is_convertible".  Maybe if it's illegal I'll file a DR some day.

(N3242's section on map modifiers is woefully incomplete -- quite a few
functions are simply not there.  I hope the FDIS is better.)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]