()函数后的括号但不是函数指针?

Red*_*ted 1 c++ templates functor parentheses template-specialization

下面是一个简单的例子,有些东西让我烦恼.此处还有一个指向在线c ++编译器的链接,这里有https://ide.geeksforgeeks.org/oxQd8FU2NV

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <class T>
void PrintF (const T& printInt) { cout << printInt << " "; }

template <class T>
class PrintClass {
public:
void operator()(T elem) const {
    cout << elem << " ";
}
};

int main () {
vector<int> vect;
for (int i=1; i<10; ++i) {
    vect.push_back(i);
}


for_each (vect.begin(), vect.end(), PrintClass<int>()); cout << endl;

for_each (vect.begin(), vect.end(), PrintF<int>);      cout << endl;

//  for_each (vect.begin(), vect.end(), PrintF<int>() );  
//  won't compile because of ()  in PrintF<int>()

return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我们不能写PrintClass<int>()if(),就像这样PrintClass<int>(第一个for_each行)?

当使用函数(不是函数对象)时,我们不能使用()(第二个for_each行),所以我们这样写PrintF<int>

我应该如何解释/解析这两个for_each函数中的第三个参数?

Nat*_*ica 5

std::for_each需要一个可以像函数一样使用的对象.当你使用

for_each (vect.begin(), vect.end(), PrintF<int>);
Run Code Online (Sandbox Code Playgroud)

PrintF<int>衰减到指向PrintF<int>函数的指针,然后for_each可以使用该指针调用该PrintF<int>函数.

for_each (vect.begin(), vect.end(), PrintClass<int>());
Run Code Online (Sandbox Code Playgroud)

PrintClass<int>是类的名称,它不是对象.您需要()在最后告诉编译器创建该类型的临时对象,PrintClass<int>然后for_each可以使用该对象来调用它operator ().

  • 在`PrintClass <int> {}`中使用`{}`也有助于消除_object construction_中的_function calling_歧义. (2认同)