类名()是否等效于类对象

Is the classname() equivalent to a class object?

本文关键字:于类 对象 是否 类名      更新时间:2023-10-16

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

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

可以写入CCD_ 2然后调用CCD_ 3

然而,我也看到人们只写transform(..,..,..,UnaryOperator());

我的问题是:classname()等价于类对象,这是真的吗?

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

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

创建UnaryOperator类的op对象并将其传递给transform。它的生存期取决于定义它的范围。也就是说,您可以在呼叫transform之后访问它。

当你这样写的时候:

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

您实际上创建了一个UnaryOperator类的临时对象,并将其传递给transform函数,它的生存期与表达式绑定。此外,在这种情况下,它将是一个常量引用或"右值"。而在第一种情况下,它要么是非常数参考,要么是常数参考。

对于给定的类型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!
}