2014-01-13 109 views
18

我碰巧在C++ 11的視頻,在這裏筆者使用auto main() - > int是什麼意思?

auto main()->int 

我沒看明白碰到下面的代碼片段。我試圖編譯g++使用-std=c++11,它的工作原理。 有人可以向我解釋這裏發生了什麼事嗎?我試圖用「auto main() - > int」進行搜索,但沒有找到任何幫助。

回答

35

C++ 11引入用於後返回類型的符號:如果函數聲明與auto引入,則返回類型的參數和一個->序列之後被指定。也就是說,所做的只是宣佈main()返回int

追溯返回類型的重要性主要針對函數模板,現在可以將函數的參數與decltype()一起用於確定返回類型。例如:

template <typename M, typename N> 
auto multiply(M const& m, N const& n) -> decltype(m * n); 

此聲明函數multiply()返回由m * n生產的類型。在multiply()前面使用decltype()將是無效的,因爲mn尚未聲明。

儘管它主要用於函數模板,但其他函數也可以使用相同的表示法。使用C++ 14時,在某些情況下使用auto引入函數時,甚至可以省略尾隨返回類型。

+12

以這種方式聲明main的優點是什麼? –

+6

@PaperBirdMaster:我並不是說有優勢。但是,這是允許的,並且不會比替代方案更糟糕。 –

+2

對不起,誤解,我不是說你說'main'上的結尾返回類型(TRT)有優勢,我只是問(並且想知道)這個TRT的使用是否有優勢在這種情況下......我認爲包括這個解釋(如果有的話)將會很好地改善答案 –

7

它被稱爲追尾型。它在使用模板的通用代碼中特別有用,其中返回類型取決於涉及其他模板參數的表達式。它也用於lambda。

下面是一個例子:

template<typename T, typename U> 
auto add(T t, U u) -> decltype(t+u) 
{ 
    return t + u; 
} 

這裏返回類型依賴於表達t+u。因此,無論表達式的類型是否也是函數的返回類型,這由decltype(t+u)指示。

11

這是一個統一函數聲明語法,尾隨返回類型,在C++ 11中引入。

對於lamdas,不能使用任何其他語法,對於結果類型依賴於參數的函數模板也是非常方便的。

如果您想選擇一個單一的語法(我認爲這是一個好主意),那麼你就沒有任何選擇:舊的語法不能用於lambda表達式。

理由這樣做,包括:

  • 好了,語法。

  • 功能名稱始終在視覺上相同的地方,支持代碼的快速掃描。

  • 同上的結果類型,簡單的視覺識別(加上,你不必限定它,當它是一個成員函數的類中定義的類型)。針對

的原因包括一些額外的冗長,用老的編譯器不理解這種語法,即任何新的東西可以感覺到可怕的,不舒服,只是奇怪。

+3

+1。我甚至在正常代碼中也使用這種語法:*功能名稱始終在視覺上相同的位置,支持快速掃描代碼*。對我們來說,人類很容易很容易找出函數的名字,因爲在'auto'之後,函數名被寫入。所有功能的視覺效果都一樣。 – Nawaz

+7

**我個人發現'auto main() - > int'是一個可怕的想法。** *「嗯,單個語法。」*除了那些已經存在的數百萬行代碼。無論如何,它都是舊代碼的混合語法。 *「功能名稱始終在可視化的相同位置,支持代碼的快速掃描。」*我使用由我的IDE生成的輪廓,掃描速度更快。 *「結果類型同上,簡單的視覺識別」。*爲什麼在'main main() - > int'中比在int main()'中找到返回類型要容易得多,返回類型在前面,我不需要通讀任何東西來找出它? – Ali

+3

@Ali:re「爲什麼找到auto main() - > int中的返回類型要比int main()中的返回類型更容易,在這種情況下返回類型是正確的,我不必通讀任何東西來查找它出來「,當你發現有必要攻擊稻草人的論點時,你承認沒有真正的論點。然而,恐怖和厭惡的感覺是不做某事的正當理由。不管感情如何非理性,它們確實會影響一個人的行爲,而且可能不必要與他們作鬥爭。 –