OpenSiv3D
OpenSiv3D copied to clipboard
JSON の const 性が簡単に破壊できる
trafficstars
概要
constなJSONに対して、access/operator[]などでアクセスした後のJSONに書き込み出来てしまう、という話です。
https://twitter.com/tomosann_tomo/status/1634458572246638592?s=20
状況
以下のような例を考えます。
// auto の推論結果は JSON
auto json = parent_json[U"key"];
constなJSONに対するaccess/operator[]等では、返り値にconst JSONが採用されています。しかしながら、そのconstは decay の発生によって失われてしまい、同時に、変数宣言でのautoは推論規則からJSONに推論されるため、結局const性は失われることとなります。(この際に呼び出されるコンストラクタはムーブコンストラクタです。)
解決策
access/operator[]等の返り値を参照(const JSON&)等にするのが理想的な解決策ではありますが、実際の所、nlohmann_json をラップしているという現状ではそれを行うのは非常に難しいものとなってしまいます。
現実的には、JSONDetailでconst性を保持しておく方針になるのではないかと思います。しかしながら、これでは折角の型システムを無視しており、型からconst性がわからないという非常に問題な挙動となり、これもあまり良いものでは無いように思えます。