4 ms·
Tried this on a vector<bool>, got this error: error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::
by tonmoy 9y ago
Tried this on a vector<bool>, got this error:
error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’
- tonmoy 9y agoworks great on vector<int> though, it turns out vector<bool> is a special case! http://stackoverflow.com/questions/30376032/error-invalid-initialization-of-non-const-reference-of-type-bool-from-an-rva http://stackoverflow.com/questions/30376032/error-invalid-in...
- klipt 9y agoDoes const auto& work though?
- gpderetta 9y agoI normally use for(auto&& x : ...) which works with those rare containers that have proxy references, while still allowing mutation.
- Manishearth 9y agoHeh, when I first heard that C++ vectors were bitvectors I was like "that can't be right? You can't get sensible references to members that way!" But it turns out that C++ is fine with breaking parametricity so references to bitvector elements just don't compile.
- Negitivefrags 9y agoI wouldn't say C++ is fine with it. vector<bool> is widely viewed as a mistake. I would actually say it's one of the few inconsistencies in a standard library that tends to be very consistent. The problem is that (quite rightly) the C++ standard committee tries very hard to not break existing code. There isn't really an easy way to deprecate a specialization of this container without causing 32x more memory use if someone was relying on it, and even worse it would be a silent breaking change.
- marvy 9y agoYou mean 8x more memory, right?
- Manishearth 9y agoI mean, this isn't the only case of broken parametricity I've come across in C++ codebases. Though it's the only one in the stdlib. I know vector<bool> is controversial (and I understand it can't be "fixed" now), I was just surprised that something breaking parametricity so blatantly was ever agreed upon in the first place -- in more functional languages parametricity is kinda much more jealously guarded. Bit of a culture shock there, is all :)