簡體   English   中英

新的C ++返回語法是否有限?

[英]Is the new C++ return syntax limited?

我開始了新的私人項目,並決定用更多的C ++ 11 / 14這段時間。 所以我也開始使用新的返回語法

auto functionName() -> returnType;

它在大多數情況下工作得很好,但現在我需要一些錯誤處理,並且無法找到如何重寫這樣的東西:

virtual const char* what() const noexcept override;

使用新語法。 是否存在無法使用新語法的情況,或者我是否只是不夠聰明才能找到正確的順序? 對我而言,保持一致是很重要的,所以我希望問題更多地在我身邊。

是的,這不是你通常猜的。

virtual auto what() const noexcept -> const char * override;

這只是您必須使用的順序。 可能語法可能不同,但這就是我們所擁有的。

問題的原因是noexcept是函數聲明noexcept的一部分(並且被認為是C ++ 17中函數類型的一部分),而override是一個(可選地使用的)標識符,它不是函數聲明符的一部分。

因此,不使用override聲明即可

virtual auto what() const noexcept -> const char *;

並且,因為override必須出現在此聲明之后,它將導致

virtual auto what() const noexcept -> const char * override;

也就是說,選擇那些最能反映您意圖的功能,而不是盲目地使用C ++ 11 / C ++ 14功能。 沒有一些規則只需要使用C ++ 11 / C ++ 14功能,如果有更舊的替代方案來實現相同的功能。

新語法支持舊語法的所有功能。

virtual const char* what() const noexcept override;

必須改寫為

virtual auto what() const noexcept -> const char * override;

實際上,新語法支持更多功能:

  • 它允許您對函數參數執行decltype

     template <typename A, typename B> auto plus(A a, B b) -> decltype(a+b) { return A + B; } 
  • 它還允許你做decltypethis ,這反過來又可以讓你做decltype的成員函數。 看到這個。

     struct S { int a() {return 1;} auto b() -> decltype(a()) {return 2;} // Works. decltype(a()) c() {return 2;} // ERROR. }; 

但是雖然新語法具有所有這些附加功能, 但它不應該是舊語法的替代品。 至少這是我理解它的方式。

一些程序員喜歡使用它,但據我所知,Stack Overflow上的大多數程序員都喜歡在可能的情況下使用舊語法。

既然您也查詢了C ++ 14,對於您的場景,這比后綴返回類型語法更好;

virtual auto what() const noexcept override;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM