假设在指定的注释中有正确的实例化,下面的表达式是合法的和可移植的C ++吗?为什么或为什么不呢?
std::mem_fun</*…*/>(&(std::vector<int>::clear))
答案 0 :(得分:3)
正如它所写,带有一组空的模板参数,没有。您需要提供正确的参数,或者完全不将它们排除,以便从参数中推断出来。
所以这是合法的:
std::mem_fun(&std::vector<int>::clear)
这是这样的:
std::mem_fun<void,std::vector<int> >(&std::vector<int>::clear)
两者都给一个带有函数调用操作符的函数对象,该操作符指向std::vector<int>
并在其上调用clear
。
编辑:正如UncleBens所提到的,功能名称周围的parantheses实际上是非法的,所以我已经从我的回答中删除了它们。
答案 1 :(得分:1)
完全合法且便携。请记住,在不同的平台/编译器上,int可能大小不同。此外,很少使用显式参数版本,让编译器推断出类型本身。
答案 2 :(得分:0)
没有
"ComeauTest.c", line 7: error: nonstandard form for taking the address of a member
function
std::mem_fun(&(std::vector<int>::clear));
^
删除额外的括号。
一般来说,我认为std::mem_fun
的唯一目的是为您推导模板参数,并选择使用mem_fun_t
,mem_fun1_t
,const_mem_fun_t
或{{1} ,所以不清楚为什么你应该明确地指定const_mem_fun1_t
的模板参数。但是,与任何其他功能模板一样,这自然是允许的。
答案 3 :(得分:0)
简短的回答:“一些流行的编译器没有。” (来自Exceptional C ++)(我将假设他正在谈论GCC或Microsoft C ++编译器)。
详细的答案详见here。我不知道答案是否仍然适用于当前的编译器版本,因为这篇文章是在2004年出版的。
我强烈建议你阅读本周的大师(gotw.ca),那里有很多有趣/有趣/好奇的东西。