初めに
この記事のコードをChatGPTに読ませたら、
explicit Proxy(Json& r) : ref(r) {}
という文が追加されていた。
explicitとは
概要
クラスや構造体に対して、暗黙的な型変換を禁止するキーワード。
コンストラクタに指定する場合と、型変換演算子に指定する場合がある。
コンストラクタ
コンストラクタにexplicitを指定したクラスは以下の制約が課される。
- コピー初期化の禁止
- 暗黙的な型変換の禁止
class Hoge{
explicit Hoge(int) {};
}
void hoge(Hoge hoge){}
int main(){
Hoge h1(0);//OK
Hoge h2 = 1;//Error: コピー初期化
Hoge h3 = Hoge(2);//OK
hoge(h1);//OK
hoge(0);//Error: 暗黙的な型変換
hoge(Hoge(2));//OK
return 0;
}
型変換演算子
型変換演算子についても同様に、暗黙的な型変換を禁止する。
class Piyo{
explicit operator bool() {
return 0;
}
};
int main(){
Piyo p;
if(p)//Error
if(static_cast<bool>(p))//OK
}
Proxyに追加する理由
ProxyはJsonを操作するためのクラスであり、Jsonから暗黙的に生成されるべきでない。
かららしい。
つまりProxyの生成箇所をoperator[]に限定するため。
参考文献
-
明示的な型変換演算子のオーバーロード [N2437]-cpprefjp
https://cpprefjp.github.io/lang/cpp11/explicit_conversion_operator.html -
C++のexplicit指定子の使い方まとめ-コウモリのちょーおんぱ
https://komorinfo.com/blog/cpp-explicit-specifier/