2012-07-22 85 views
1

我知道这可能是一个愚蠢的问题,但我不知道如何正确描述它。 当我尝试调用例如std::transform功能,classname()是否等同于类对象?

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

可以写成UnaryOperator op;,然后调用transform(..,..,.., op);

不过,我也看到有人写的只是transform(..,..,..,UnaryOperator());

我的问题是:是不是真的classname()相当于一个类对象吗?

回答

3

我不知道究竟你的意思classname(),但是当你这样写:

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

...创建UnaryOperatorop对象,并把它传递给transform。它的寿命取决于它的定义范围。即您可以在致电transform后访问它。

当你像这样写:

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

...本质就是UnaryOperator类的临时对象,并把它传递给transform功能,其寿命是联系在一起的表达。此外,在这种情况下,它将是一个常量引用或“右值”。而在第一种情况下,它是非常数或常量参考。

+0

感谢,所以你的意思是,当你写UnaryOperator()你是调用默认构造函数。 – SJinxin 2012-07-22 00:45:55

+0

*表达式* UnaryOperator()总是一个右值。然而,相同的文本可以被解析为声明,具体取决于上下文。 – 2012-07-22 00:46:05

+0

@ Cheersandhth.-Alf你说得对,在函数等待右值引用如'&&'(C++ 11)的情况下,正确的名称是什么? – 2012-07-22 00:57:36

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! 
} 
相关问题