読者です 読者をやめる 読者になる 読者になる

constexpr variantの限界:自分版

Variant
型安全Union
関数型風にいうと直和型
例えば

 Variant<int,double,string> 

であればint,double,stringの内どれかの値が入っている
複数の型のうちの一つを入れることができる型

variantはとても便利な機能だ。C++の標準にもこれと似たものを入れようという動きがある。それだけこの機能が求められているということであろう

それだけ求められているvariantである。やはりconstexprに対応させたい。させるべきである。そう考えるのは人間の道理である。

melpon.org


しかしこのクラスにはoperator=が実装されていない。実装できなかったのだ

variant a(3),b(string("ABC"));
a=b;

このような時、プログラムはどのように動くべきであろうか
何らかの方法で3の値を安全に破棄し、『何らかの方法でstring()を構築して』ABCを代入する
と言ったところであろう
実行時であればplacement newを用いて3があったメモリ上にstringを構築するであろう
しかし、それはコンパイル時にはできないことなのだ。コンパイル時にnewを行うことはできない
故にstringを構築できず、故にoperator=を実装することができないのである


故に、完全なconstexpr variantを作ることができなかったのである。私は

さぁ、私でないあなた。今すぐC++を立ち上げよう。この問題を解決しよう