Od noexcept
został wprowadzony i zająć wiele problemów z throw()
, obecnie istnieje powód, dla określenia, czy dana funkcja nie wyjątek. Chociaż nie jest to ograniczenie czasu kompilacji, umożliwi ono niektórym potencjalnym optymalizacjom kompilatora, a jeśli nic innego, sygnalizację i dokumentację, wartość dla użytkownika funkcji.Dlaczego noexcept nie jest więcej używane w standardowej bibliotece?
W świetle tego byłem rzeczywiście trochę zaskoczony, kiedy przeglądałem za pośrednictwem standardowych funkcji, takich jak: std::time
, std::timespec_get
i std::memcmp
, i zobaczył, że żaden z nich nie wykorzystał noexcept
specyfikator. Nie jest tak, że nie używa się żadnych funkcji w standardowej bibliotece, na przykład funkcja std::tie
używa go, a także innych. Ale duża część funkcji, nie używaj go.
Sądzę, że ma to sens w przypadku funkcji, które mają niezdefiniowane zachowanie w pewnych sytuacjach, takich jak std::strlen
, ponieważ pozwoli to wdrażającym na większą swobodę.
Ale dla funkcji, w których nie ma określonych sytuacji, które mogą prowadzić do niezdefiniowanego zachowania i które oczywiście nie powodują wyjątków, dlaczego funkcje te nie powinny być deklarowane przy użyciu specyfikatora noexcept
?
Może to być nie tylko ze względu na zachowanie podobieństwa ze starymi funkcjami C, ponieważ na przykład std::timespec_get
jest nową funkcją w C++ 11, więc musi to być z jakiegoś innego powodu.
Kompilator może równie dobrze być na tyle silny, aby wykryć, że funkcje nie będą rzucać wyjątki, i jako takie być w stanie wykonać te same optymalizacje. Ale moim zdaniem jednym z najlepszych argumentów dla noexcept
jest wartość dokumentacji, która pochodzi z niego, której brakuje, kiedy jej brakuje.
Co prowadzi mnie do mojej ostatniej hipotezy, że brakujące specyfikatory noexcept
w standardowej bibliotece są naprawdę niedopatrzeniami, podobnie jak miało to miejsce w przypadku missing std::make_unique
. Ale w przeciwieństwie do brakującej std::make_unique
który został skorygowany (realizowanego) w C++ 14, funkcje powyżej, nadal nie ma (jak C++ 17) został złożony noexcept
.
Czy ktoś wie uzasadnienie brakujących noexcept
specyfikatorami, czy mam rację sądząc, że jest to niedopatrzenie?
Trzeba by zapytać kurtuazji. Należy pamiętać, że po zadeklarowaniu funkcji 'noexcept', jej usunięcie byłoby przełomową zmianą. Zawsze możesz dodać go później, zachowując kompatybilność wsteczną. –
Zobacz pierwszy akapit [tutaj] (https://stackoverflow.com/a/20517333/4342498). Może być tym, czego szukasz – NathanOliver
@NathanOliver, który jest rzeczywiście interesującym wpisem. Jednak nie tylko funkcje, które określiły niezdefiniowane zachowanie, nie posiadają specyfikatora 'noexcept', ale także funkcję, której" nie można "lub" nie wolno ", mogą jej brakować. Przynajmniej wynika to z mojego krótkiego śledztwa. –