如果一個函數聲明了[[nodiscard]],則該函數的返回值不能沒有承接,如果沒有承接,就會編譯報warning
[[nodiscard]]是c++17新特性,但本地用c++11標準編譯也能編譯過,尚不清楚原因,c++20加入了warning后的額外文字描述功能
測試代碼
struct [[nodiscard]] error_info { /*...*/ };
error_info enable_missile_safety_mode() { /*...*/ return {}; }
void launch_missiles() { /*...*/ }
void test_missiles()
{enable_missile_safety_mode(); // compiler may warn on discarding a nodiscard valuelaunch_missiles();
}
error_info& foo() { static error_info e; /*...*/ return e; }
void f1() { foo(); } // nodiscard type is not returned by value, no warning
// nodiscard( string-literal ) (since C++20):
[[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }int main()
{strategic_value(4, 2); // compiler may warn on discarding a nodiscard valueauto z = strategic_value(0, 0); // ok: return value is not discardedreturn z;
}
一個疑問:
為什么nodiscard屬性不是默認值,似乎返回值沒有被利用就是一個bug才對
解答:
因為考慮向后兼容,如果改為默認的話,那之前編寫的代碼將會發出警告,雖然可以編譯成功,但這將是個重大的語義變化,新語言使用這個特性作為默認是有道理的,因為不用考慮兼容問題,如Nim語言
nodiscard使用場景:
- 如果一個函數除了返回某個結果之外沒有其他作用,即是純的。如果不使用結果,則調用肯定是無用的
- 如果一個返回值必須被檢查,比如返回錯誤碼