標準C++の欠陥解決は、過去のバージョンに遡って適用される

C++17で入る予定の、可変引数でミューテックスを受け取ってスコープを抜けたらロック解除するscoped_lockクラスですが、C++17がDIS (Draft International Standard) の段階になり、仕様の手直しがもうほぼできない段階になってから、引数順の変更が行われました。

この変更は、ドラフト仕様 (Working Draft) としては、さらに次のバージョンのC++20に適用されました (Editor’s Reportを参照) 。しかし、libstdc++、libc++といった標準ライブラリの実装や、cppreferenceサイトなどでは、この変更がC++17に取り込まれたものとして扱っていました。

さらに、cppreferenceサイトでは、「この変更は、過去にリリースされたC++バージョンに遡って適用された」と書いてありました。そんなことが標準ドキュメントのどこに書いてあるのかわからず、また、過去のバージョンに遡って適用される変更がどれなのかわからないと、なにをC++17と言っていいのかわからなくなります。ですので、std-discussionメーリングリストで質問してみました。

この質問への返答を要約すると、以下のような扱いになっていました:

  • 欠陥 (Defect) の解決は、基本的に過去のバージョンに遡って適用される
  • これは、既知の欠陥と解決策がわかっていれば、コンパイラや標準ライブラリの実装はできるだけ早くそれを適用したいから

それと今回の場合、C++17はまだ策定が完了しておらず、その段階で標準ライブラリの全ての実装が、すでにこの変更に対応しています。ですので、今回の変更は少なくともC++17に含まれると考えられます。また、欠陥の修正は、どのバージョンの仕様書に適用されたかだけでなく、修正内容が報告された時期が重要で、実装にはすぐに適用されることがある、ということがわかりました。