1

我知道这可能是一个愚蠢的问题,但我不确定如何正确描述它。例如,当我尝试调用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()是否等同于类对象?

4

2 回答 2

3

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

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

...您创建op类对象UnaryOperator并将其传递给transform. 它的生命周期取决于定义它的范围。即你可以在调用后访问它transform

当你这样写时:

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

...您实质上创建了一个类的临时对象UnaryOperator并将其传递给transform函数,并且它的生命周期与表达式相关联。此外,在这种情况下,它将是常量引用或“右值”。而在第一种情况下,它要么是非常量引用,要么是常量引用。

于 2012-07-22T00:36:25.520 回答
0

对于给定的 type T,在正确的情况下,表达式的T()计算结果是一个临时的、默认构造的 type 对象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!
}
于 2012-07-22T00:50:13.103 回答