为什么不能从元组中分配一对,但是可以从一对中分配元组?

时间:2014-01-23 06:40:12

标签: c++ c++11 std-pair stdtuple

我不清楚为什么分配tuple<X,Y>=pair<X,Y>

是合法的

但是分配pair<X,Y>=tuple<X,Y>

是违法的
    std::pair<int, double> x { 1 , 5.5};
    std::tuple<int, double> y { 1 , 5.5};
    int a;
    double b;
    std::tie(a,b) = x;
    std::tie(a,b) = y;
    x = y;  // THIS LINE (line 12)
    y = x;  // but this is fine ???

这不应该是对称的吗?

使用g ++ 4.8.1会出现以下错误:

tp.cpp:12:4: error: no match for operator= (operand types are std::pair<int, double> and std::tuple<int, double>)
  x = y;
    ^
tp.cpp:12:4: note: candidates are:
In file included from /opt/gcc-4.8.1/include/c++/4.8.1/utility:70:0,
                 from /opt/gcc-4.8.1/include/c++/4.8.1/tuple:38,
                 from tp.cpp:1:
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:158:7: note: std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(const std::pair<_T1, _T2>&) [with _T1 = int; _T2 = double]
       operator=(const pair& __p)
       ^
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:158:7: note:   no known conversion for argument 1 from std::tuple<int, double> to const std::pair<int, double>&
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:166:7: note: std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(std::pair<_T1, _T2>&&) [with _T1 = int; _T2 = double]
       operator=(pair&& __p)
       ^
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:166:7: note:   no known conversion for argument 1 from std::tuple<int, double> to std::pair<int, double>&&
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:177:2: note: template<class _U1, class _U2> std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(const std::pair<_U1, _U2>&) [with _U1 = _U1; _U2 = _U2; _T1 = int; _T2 = double]
  operator=(const pair<_U1, _U2>& __p)
  ^
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:177:2: note:   template argument deduction/substitution failed:
tp.cpp:12:4: note:   std::tuple<int, double> is not derived from const std::pair<_T1, _T2>
  x = y;
    ^
In file included from /opt/gcc-4.8.1/include/c++/4.8.1/utility:70:0,
                 from /opt/gcc-4.8.1/include/c++/4.8.1/tuple:38,
                 from tp.cpp:1:
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:186:2: note: template<class _U1, class _U2> std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(std::pair<_U1, _U2>&&) [with _U1 = _U1; _U2 = _U2; _T1 = int; _T2 = double]
  operator=(pair<_U1, _U2>&& __p)
  ^
/opt/gcc-4.8.1/include/c++/4.8.1/bits/stl_pair.h:186:2: note:   template argument deduction/substitution failed:
tp.cpp:12:4: note:   std::tuple<int, double> is not derived from std::pair<_T1, _T2>
  x = y;
    ^

1 个答案:

答案 0 :(得分:7)

我认为这是另一种情况:

  

没人建议。

Fwiw,您的代码与libc++一起使用(作为扩展名)。 libc ++实现了一个“类似元组”的概念,其中包括tuplepairarray,然后有成员模板(在tuplepair上)运行关于“类似元组”的类型。这种方法并非完全没有问题,但看起来确实很有希望。