OpenSiv3D icon indicating copy to clipboard operation
OpenSiv3D copied to clipboard

JSON の const 性が簡単に破壊できる

Open tomolatoon opened this issue 2 years ago • 0 comments
trafficstars

概要

constJSONに対して、access/operator[]などでアクセスした後のJSONに書き込み出来てしまう、という話です。 https://twitter.com/tomosann_tomo/status/1634458572246638592?s=20

状況

以下のような例を考えます。

// auto の推論結果は JSON
auto json = parent_json[U"key"];

constJSONに対するaccess/operator[]等では、返り値にconst JSONが採用されています。しかしながら、そのconstは decay の発生によって失われてしまい、同時に、変数宣言でのautoは推論規則からJSONに推論されるため、結局const性は失われることとなります。(この際に呼び出されるコンストラクタはムーブコンストラクタです。)

解決策

access/operator[]等の返り値を参照(const JSON&)等にするのが理想的な解決策ではありますが、実際の所、nlohmann_json をラップしているという現状ではそれを行うのは非常に難しいものとなってしまいます。

現実的には、JSONDetailconst性を保持しておく方針になるのではないかと思います。しかしながら、これでは折角の型システムを無視しており、型からconst性がわからないという非常に問題な挙動となり、これもあまり良いものでは無いように思えます。

tomolatoon avatar Mar 11 '23 07:03 tomolatoon