std :: make_pair,c ++ 11和显式模板参数

时间:2015-03-31 15:23:29

标签: c++ c++11 c++03

Reedited:首先,这只是一个好奇的问题,我知道,std :: pair或许多其他解决方案可以根除这个问题。

你能告诉我,这个问题到底是什么原因?此代码是一个处理c ++ 03的简单示例,在c ++ 11上失败。

    std::pair<int*,int**> getsth(int* param)
    {
        return std::make_pair<int*,int**>(param, 0);
    }

    int main(int argc, char* argv[])
    {
        int* a = new int(1);
        std::pair<int*,int**> par = getsth(a);
        std::cout << *par.first;
        return 0;
    }

我确实知道如何修复它以兼容这两个标准,但它让我感到厌恶,我不知道,在这种情况下,make_pair背后究竟是什么。

谢谢!

编辑:来自Coliru的编译错误消息:

main.cpp: In function 'std::pair<int*, int**> getsth(int*)':
main.cpp:8:47: error: no matching function for call to 'make_pair(int*&, int)'
     return std::make_pair<int*,int**>(param, 0);
                                               ^
main.cpp:8:47: note: candidate is:
In file included from /usr/local/include/c++/4.9.2/bits/stl_algobase.h:64:0,
                 from /usr/local/include/c++/4.9.2/bits/char_traits.h:39,
                 from /usr/local/include/c++/4.9.2/ios:40,
                 from /usr/local/include/c++/4.9.2/ostream:38,
                 from /usr/local/include/c++/4.9.2/iostream:39,
                 from main.cpp:1:
/usr/local/include/c++/4.9.2/bits/stl_pair.h:276:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
     make_pair(_T1&& __x, _T2&& __y)
     ^
/usr/local/include/c++/4.9.2/bits/stl_pair.h:276:5: note:   template argument deduction/substitution failed:
main.cpp:8:47: note:   cannot convert 'param' (type 'int*') to type 'int*&&'
     return std::make_pair<int*,int**>(param, 0);
                                               ^
main.cpp:9:1: warning: control reaches end of non-void function [-Wreturn-type]
 }

2 个答案:

答案 0 :(得分:8)

Rvalue引用发生了。 C ++ 03中的std::make_pair具有签名

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

在C ++ 11中,它有

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

V1V2(通常)std::decay<T1|T2>::type。 C ++ 14添加了constexpr,但这确实与我们有关。

这意味着显式函数模板特化std::make_pair<int*, int**>在C ++ 03中接受了int*int**类型的参数,而C ++ 11中的新参数接受{ {1}}和int*&&

int**&&绑定到0不是问题,但int**&&是左值,不能绑定到param的右值引用。这就是为什么你的代码在C ++ 11中爆炸的原因。

出于这个原因,

int*

适用于C ++ 03和C ++ 11 - return std::make_pair<int*&, int**>(param, 0); 可以绑定到param,生成的int*&可以转换为std::pair<int*&, int**>函数想要在两个版本中返回。

但是,这是相当丑陋的,并且std::pair<int*, int**>并不是真正意味着以这种方式使用。作为@ T.C。在评论中指出,如果您知道std::make_pair应该具有的类型,请使用

std::pair

答案 1 :(得分:3)

您需要删除make_pair的模板参数。 Here是关于原因的更多信息。

此外,您应该将nullptr传递给make_pair,而不是0。

相关问题