【发布时间】:2015-03-31 15:23:29
【问题描述】:
重新编辑:首先,这只是一个好奇的问题,我知道,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]
}
【问题讨论】:
-
请显示你的编译错误,假设有一个
-
写
std::make_pair<int*,int**>(param, 0)是totally pointless,make_pair的全部意义在于推导参数类型。如果您不想推断类型,那么只需说std::pair<int*,int**>(param, 0)并省去输入五个冗余字符。 -
只是要指出
return {param, 0}; -
@chris 03 年不上班。