Fix std::pair std::is_copy_assignable behavior

François Dumont
Wed Apr 17 20:23:00 GMT 2013

On 04/17/2013 10:02 PM, Paolo Carlini wrote:
> Hi,
> On 4/17/13 8:43 PM, François Dumont wrote:
>> On 04/17/2013 09:18 PM, Paolo Carlini wrote:
>>> On 4/17/13 8:10 PM, François Dumont wrote:
>>>> Hi
>>>>     Here is an other proposal to fix 
>>>> std::is_copy_assignable<std::pair<>>.
>>> Sorry, I'm still missing something very, very basic: which behavior 
>>> is conforming, the current one or what we would get instead? If the 
>>> former, is there a DR arguing for the latter?
>>> Paolo.
>>     The behavior I am targeting is 
>> std::is_copy_asignable<std::pair<const int, int>> to be 
>> std::false_type for instance. I have added test for many other use 
>> cases. More generally I need that when std::is_copy_assignable<T> is 
>> std::true_type then writing a = b, with a and b being T, does compile.
>>     Otherwise this patch just make std::pair match the Standard 
>> requirements like at Do you want me to add a bug report in 
>> Bugzilla first ?
> I'm not talking about GCC's Bugzilla, I meant an ISO DR: if we don't 
> have a DR and preferably a vague support of LWG people, I think we 
> should not change the behavior of our std::is_copy_assignable only 
> because it helps our implementation of other facilities.
> Paolo.
     I really don't get it. Is current behavior really Standard compliant ?

     I don't think so and would like to fix it. The Standard says that 
pair& operator=(const pair&) requires that both 
is_copy_assignable<first_type> and is_copy_assignable<second_type> to be 
true. With std::pair<const int, int>, is_copy_assignable<const int> is 
false and then the operator is ill formed. It is if you try to call it 
but if you check is_copy_assignable<pair<const int, int>> it says true. 
Do you see it as a correct behavior ? Do you really think that it 
requires an ISO DR ?


More information about the Libstdc++ mailing list