2012-07-22 87 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! 
} 
相關問題