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