使用for_each或std::transform时,c++函函数构造函数是如何被调用的?
How do C++ functor constructors get called when used with for_each or std::transform
我以前从未使用过c++函子,所以我只是想了解它们是如何工作的。
。假设我们有这个函子类
class MultiplyBy {
private:
int factor;
public:
MultiplyBy(int x) : factor(x) { }
int operator () (int other) const {
return factor * other;
}
};
像这样使用对我来说很清楚:
MultiplyBy mult_3(3);
int x = mult_3(100);
显然,使用参数3调用了MultiplyBy的构造函数。
但是在下面的例子中,如何使用数组中的值调用构造函数?
int array[5] = {1, 2, 3, 4, 5};
std::transform(array, array + 5, array, MultiplyBy(3));
那么,在最后一种情况下,您将创建一个新的MultiplyBy
对象,其中3作为构造函数参数。这个对象然后被传递给std::transform
,然后它调用operator()
。
如果它能帮助你更好地理解,这是相同的:
int array[] = {1, 2, 3, 4, 5};
MultiplyBy times3(3);
std::transform(array, array + 5, array, times3);
你可以把转换想象成这样的结构:
void transform(Iterator b, Iterator e, Functor f)
{
for(;b != e; ++b)
{
*b = f(*b);
}
}
函子按值传递给函数。
所以当你像这样调用:
std::transform(array, array + 5, array, MultiplyBy(3));
在这里您已经创建了一个临时对象。它作为参数值传递给transfer()。这将导致函数被复制到函数中(这不是问题,因为它只有一个POD成员,并且编译器生成的复制构造函数工作得很好)。然后该参数就可以正常使用了。
注意:临时对象在创建它的表达式的末尾被销毁(将在transform()返回之后)。
MultiplyBy(3)
创建一个未命名的临时变量,该变量传递给transform
,并且(在此时)给出该函数中参数的相应名称。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 构造函数/函数声明参数列表中的统一初始化
- 在c++中为链接列表创建复制构造函数/函数
- 如何声明模板函数,以便可以在类构造函数/函数中传递
- 在C 中,如何调用构造函数函数
- 在C++中构造模板函数时出现编译错误 C2664 和 C2440
- Rcpp:构造模板函数
- 采用nulltpr_t的构造函数:函数定义不声明参数
- 使用基于模板的构造函数构造std::函数
- 构造函数:函数不接受3个参数
- 就地构造 std::函数目标
- 将字符串构造作为函数参数传递
- C++:从模板化方法构造std::函数
- 构造std::函数的向量时出现编译器错误
- 构造<stl_hashtable>函数参数是否在
- libstdc++和libc++在用lambda构造std::函数时的不同行为
- 编译器构造-带有函数的类的c++sizeof()
- 使用 c++11 构造映射函数
- 调用构造与函数原型混淆
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参