【问题标题】:Why does make_pair<int,int> fail in C++ 11? [duplicate]为什么 make_pair<int,int> 在 C++ 11 中失败? [复制]
【发布时间】:2019-11-08 18:55:43
【问题描述】:

以下代码在编译为 C++ 98 时运行良好,但编译为 C++ 11 时失败。为什么?

#include <iostream>
#include <utility>

using namespace std;

int main()
{
    int u = 1;
    pair<int, int> p = make_pair<int, int>(0, u);
    cout << p.first << " " << p.second << "\n";
}

来自 g++ (Debian 8.3.0-6) 8.3.0 的错误信息是:

foo.cpp: In function ‘int main()’:
foo.cpp:9:45: error: no matching function for call to ‘make_pair<int, int>(int, int&)’
  pair<int, int> p = make_pair<int, int>(0, u);
                                             ^

我知道我可以简单地通过从make_pair 中删除模板说明符并让编译器自行决定类型来编译它。但我有兴趣了解从 C++ 98 到 C++ 11 的哪些变化导致此代码不再兼容。

【问题讨论】:

  • 你编译时使用 -std=c++11 标志还是什么?
  • @Boki 我用-std=c++11-std=c++98 测试过。

标签: c++ c++11 stl


【解决方案1】:

你不应该将类型参数传递给make_pair;它旨在推断其论点。如果你想创建一个完全符合类型的东西,只需执行std::pair&lt;int, int&gt;

中添加了右值引用和完美转发; make_pair&lt;int,int&gt; 有签名 (int&amp;&amp;, int&amp;&amp;)。这些都是右值引用,不能绑定到左值(如u)。

make_pair&lt;int, int&amp;&gt;(0, u) 将编译并生成 pair&lt;int, int&gt;,因为 make_pair 创建了一对值类型。

如果 中没有右值引用,则不会发生此问题。可能make_pairmake_pair( A const&amp;, B const&amp; ) 而不是make_pair( A&amp;&amp;, B&amp;&amp; )

【讨论】:

    【解决方案2】:

    在c++11之前有

    template< class T1, class T2 >
    std::pair<T1,T2> make_pair( T1 t, T2 u );
    

    您将 T1 和 T2 定义为:int,因此 int 可以采用左值和右值。

    从 c++11 开始你就有了

    template< class T1, class T2 >
    std::pair<V1,V2> make_pair( T1&& t, T2&& u );
    

    因为T2 被定义为int,所以int&amp;&amp; 作为第二个参数只能取右值。但是u 是左值。

    【讨论】:

      【解决方案3】:

      std::make_pair 已在 c++03c++11 之间更改。

      您的代码失败,因为 std::make_pair 期望 T&amp;&amp;U&amp;&amp;,其中 TU 是模板类型参数。 喜欢

      template <typename T, typename U>
      std::pair<V1,V2> make_pair(T&& argT, U&& argU);
      

      如果您想同时指定这两个参数,请使用pair&lt;int, int&gt;

      例子-

      #include <iostream>
      #include <utility>
      using namespace std;
      
      int main() {
          int u = 1;
          pair<int, int> p = pair<int, int>(0, u);
          cout << p.first << " " << p.second << "\n";
      }
      

      您可以参考这里了解更多详情 - utility-make_pair

      【讨论】:

      • 你的版本用-std=c++98编译。所以你总是可以用构造函数实例化这对。为什么需要make_pair
      • 使用make_pair,您可以使用花括号简单地添加元素而无需输入整个内容。看到这个link
      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2012-11-27
      • 2022-09-28
      • 2018-05-05
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多