This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ 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]

Re: Failing test when run as C++11


2014-05-11 20:39 GMT+02:00 Jonathan Wakely <jwakely@redhat.com>:
> On 11/05/14 20:16 +0200, Daniel Krügler wrote:
>>
>> 2014-05-11 19:25 GMT+02:00 Jonathan Wakely <jwakely@redhat.com>:
>>>
>>> So this actually reveals a latent bug: we use the traits to decide
>>>
>>> whether we want to use C(const C&) or C(C&&) but then we actually end
>>> up using C(C&) or C(C&&), so this fails to compile:
>>>
>>> #include <vector>
>>>
>>> struct C {
>>> C() { }
>>> C(const C&) { }
>>> C(C&&){}
>>>
>>> template<typename T> C(T&) = delete;
>>>
>>> };
>>>
>>> int main() {
>>> std::vector<C> v(1);
>>> v.resize(v.capacity()+1);
>>> }
>>>
>>> With my patch to stl_iterator.h that compiles.
>>> I'm not sure if it's required to compile or not. I don't think the
>>> standard is clear what should happen here. I'd be interested to know
>>> what other implementations do.
>>
>>
>> My interpretation of the wording is here the same as for my previous
>> example: It should work, because C is MoveInsertable and
>> DefaultInsertable.
>>
>> Both clang and Visual Studio 2012 accept the code.
>
> Good to know, thanks.
>
> So my next question is whether they call the copy constructor or the
> potentially-throwing move constructor during the resize operation.

Both invoke the move constructor. And I don't see why this would
conflict with the requirements of resize().

- Daniel


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