2017-06-07 16 views
16

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?

+6

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ą. –

+7

Zobacz pierwszy akapit [tutaj] (https://stackoverflow.com/a/20517333/4342498). Może być tym, czego szukasz – NathanOliver

+0

@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. –

Odpowiedz

1

Parafrazując to, co napisałem wyżej,

w jaki sposób można zagwarantować noexcept gdy sprawy są przekazywane przez wskaźniki?

Kiedy piszesz niestandardowych klas/funkcji, można oznaczyć rzeczy noexcept bez żadnej gwarancji nie rzuca wyjątek. Ale prawdopodobnie nie chcesz tego robić, gdy nie masz absolutnej pewności, że twoja funkcja nie będzie w ogóle działać.

Powiązane problemy