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: std::pair copy and move constructor


On 02/16/2013 01:21 PM, Daniel Krügler wrote:
2013/2/16 François Dumont<frs.dumont@gmail.com>:
On 02/15/2013 10:00 PM, Daniel Krügler wrote:
2013/2/15 François Dumont<frs.dumont@gmail.com>:
Hi

      I had a problem with the result of
std::is_copy_assignable<std::pair<const int, int>>::type which used to be
true_type. So here is a patch to fix that.
This patch would break with the requirements of the library. In
particular it would prevent that std::pair's of references are
copy-assignable and that exactly is the purpose for the user-provided
copy-assignment operators of pair (and tuple).
I knew there must have been something.

Is there a test showing this problem ?
I would expect that the following code would no longer be accepted:

#include <utility>

int main() {
   int i{};
   int j{};
   std::pair<int&, int&> pii1(i, j);
   const std::pair<int&, int&> pii2(i, j);
   pii1 = pii2;
}

because with a defaulted copy-assignment operator, std::pair<int&,
int&> would have a deleted copy-assignment operator.
I finally wonder if the compiler couldn't help here. If the copy assignment is deleted why wouldn't the compiler try to use the template assignment operator ? Is there something in the Standard saying that only the copy assignment operator can be used ? If so, couldn't the Standard be amended to allow this behavior ?

It sounds like a natural behavior when the copy assignment operator is default implemented and when this default implementation can't be generated that the compiler consider other challengers. In the case of std::pair<int&, int&> it even makes a lot of sens to use the template assignment operator as the currently manually written copy assignment operator behaves like a simple assignment operator as soon as a reference type is involved.

François


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