std::is_assignable and std::pair

后端 未结 1 1495
暗喜
暗喜 2021-01-06 20:05

As expected, the following code does not compile.

#include 
#include 
int main()
{
    using T = std::pair

        
1条回答
  •  花落未央
    2021-01-06 20:49

    1. is_assignable asks the question "is there an assignment operator signature that accepts these arguments", not "will that assignment operator actually compile" (in standardese, it only considers the immediate context of the assignment expression):

      template
      struct foo {
          T t {};
          foo& operator=(const foo& r) { t = r.t; };
      };
      static_assert(std::is_copy_assignable>::value, ""); // OK
      
      void bar() {
          foo f1, f2;
          f1 = f2; // explodes
      }
      
    2. pair's assignment operators can't be defaulted, because it needs to do something special when the pair contains a reference. That means that additional precautions need to be taken to ensure that is_assignable doesn't lie (e.g., making sure that the copy assignment operator is deleted if a member type is not copy assignable). The standard has not mandated such precautions until very recently.

    3. is_assignable asks whether a T rvalue can be assigned to a T rvalue. This is an odd question to ask.

    0 讨论(0)
提交回复
热议问题