std :: mem_fun表达式的可移植性

时间:2010-01-18 12:33:26

标签: c++

假设在指定的注释中有正确的实例化,下面的表达式是合法的和可移植的C ++吗?为什么或为什么不呢?

std::mem_fun</*…*/>(&(std::vector<int>::clear))

4 个答案:

答案 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_tmem_fun1_tconst_mem_fun_t或{{1} ,所以不清楚为什么你应该明确地指定const_mem_fun1_t的模板参数。但是,与任何其他功能模板一样,这自然是允许的。

答案 3 :(得分:0)

简短的回答:“一些流行的编译器没有。” (来自Exceptional C ++)(我将假设他正在谈论GCC或Microsoft C ++编译器)。

详细的答案详见here。我不知道答案是否仍然适用于当前的编译器版本,因为这篇文章是在2004年出版的。

我强烈建议你阅读本周的大师(gotw.ca),那里有很多有趣/有趣/好奇的东西。