[C++] 継承を含む集成体が構造化束縛できない問題について
解決したいこと
表題の件について、標準化の提案をしたいと思っています。
そこで、行動する前に自分以外の考えも知りたく、この問題について皆さんの意見を伺えないでしょうか。
- 皆さんの環境下で下記コードのコンパイルが通るかどうか。
- 下記コードは有効であるべきかどうか。
問題となるコードの一例
struct int_x2_holder { int i1, i2; };
enum class enum_abc { a, b, c };
struct enum_x2_holder { enum_abc e1, e2; };
struct values_holder : int_x2_holder, enum_x2_holder {};
int main() {
values_holder ver = { 1, 2, enum_abc::a, enum_abc::b }; // 集成体初期化
auto [v0, v1, v2, v3] = ver; // 構造化束縛
return static_cast<int>(v3);
}
私見
- コンパイル結果
- Windows 11 / Visual Studio Community 2022 (64bit) Version 17.0.0
- コンパイルエラー(C3643)
- この結果への意見
- コンパイラのアルゴリズムとして不可能でないなら、集成体初期化の際と同様の順で構造化束縛が可能であるべきだと思う。
以上、何卒ご意見お聞かせください。
また、代わりにisocppに提案するぜ、と言う方がいらっしゃいましたら挙手願います。
(あるいは提案の仕方を誰か教えてくれませんか)
解決策
std::tuple_sizeとstd::tuple_elementの両方の特殊化を記述すればtupleとしての扱いを優先してくれるとのこと。
tuple-likeかつusing is_tupleが定義されていたら自動で特殊化するようにしました。
1