[英]Is the new C++ return syntax limited?
是的,這不是你通常猜的。
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; }
它還允許你做decltype
在this
,這反過來又可以讓你做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.