
項目 28:参照の圧縮を理解する
|
201
{ T オブジェクトから std::string を作成可能かを検証
// assert that a std::string can be created from a T object
static_assert(
std::is_constructible<std::string, T>::value,
"Parameter n can't be used to construct a std::string"
);
… // the usual ctor work goes here
通常のコンストラクタ処理
}
… // remainder of Person class(as before)
その他(先の例と同様)
};
上例は、呼び出し側が、std::string を作成できない型から Person を作成しようとすると、エ
ラーメッセージを出力します。残念なのは、上例の static_assert はコンストラクタ内にあり、転
送するコードとは離れている点です。転送コードはメンバ初期化リスト内であり、static_assert
よりも先に記述しています。著者が使用しているコンパイラで試すと、通常のエラーメッセージの
後に(最長で 160 行以上)、分かりやすく読みやすい static_assert のメッセージが表示されま
した。
重要ポイント
•
ユニヴァーサル参照とオーバロードの併用の代替策には、(1)関数名を区別する、(2)仮引
数を「const オブジェクトの左辺値参照渡し」 ...