classname()是否等同于类对象?

时间:2012-07-22 00:28:53

标签: c++ transform function-object

我知道这可能是一个愚蠢的问题,但我不确定如何正确描述它。 当我尝试调用std::transform函数时,

template < class InputIterator, class OutputIterator, class UnaryOperator >
  OutputIterator transform ( InputIterator first1, InputIterator last1,
                             OutputIterator result, UnaryOperator op )

可以写UnaryOperator op;,然后拨打transform(..,..,.., op);

但是我也看到人们只写transform(..,..,..,UnaryOperator());

我的问题是:classname()是否等同于类对象?

2 个答案:

答案 0 :(得分:3)

我不知道classname()到底是什么意思,但当你写这样的时候:

UnaryOperator op;
transform(..,..,.., op);

...您创建了类op的{​​{1}}对象并将其传递给UnaryOperator。它的寿命取决于定义的范围。即您可以在致电transform后访问它。

当你写这样的时候:

transform

...你基本上创建了一个类transform(..,..,.., UnaryOperator()); 的临时对象并将其传递给UnaryOperator函数,它的生命周期与表达式相关联。此外,在这种情况下,它将是常量引用或“右值”。而在第一种情况下,它是非常数或恒定参考。

答案 1 :(得分:0)

对于给定类型T,在正确的情况下,表达式T()将求值为T类型的临时默认构造对象。以下是一些可以使用的情况:

// Ex 1:
T x; x = T();   // overwrite `x` with a copy of a default-T

// Ex 2:
T x = T();      // copy-initialize from default-T (probably elided)

// Ex 3 (note that temporaries bind to const&):
void foo(int n = 10, T const & t = T());  // default argument

// Ex 4:
std::string format_me(int a)
{
    return static_cast<std::ostringstream&>(std::ostringstream() << a).str();
    //                            temporary ^^^^^^^^^^^^^^^^^^^^
}

请注意T()意味着其他事情的情况:

{
    T t(T());   // `t` is _not_ an object of type T!
}