質問: nullptr > struct Y {}; int main() { X(); //X(); Y; //Y(); } ``` 基本的にどちらで制限するべきなのでしょうか? SFINAEを用いたオーバーロードをさせたい場合はenabler、それ以外はstatic_assertで通知すべきでしょうか? それともstatic_assertには別の目的があるのでしょうか。 static_assertを使用したいと思ったのですが使用せずとも困ったことがないため用途を教えていただきたいです。
回答: SFINAE 的にはマッチに失敗したら次の候補の展開を試みますが、 `static_assert` の第一引数が偽の形に展開されたら問答無用でコンパイル全体が失敗です。 ですから、使い分けに関する認識は妥当だと思います。 自分で書いたテンプレートは自分でよく把握しています。 使いこなせる範囲のものしか書きません。 ですから使い方を間違うことはあまりありませんし、間違ったらどこで間違ったのか気づきやすいです。 しかし、充分に使い方を把握していない誰かが間違った使い方をしたときに普通のエラーメッセージから問題点を読み取れるでしょうか? 自分が書いたものを数か月、数年後まできちんと覚えているでしょうか? もちろん充分に小さなプログラムであれば把握できるでしょうし、近頃はコンパイラのエラーメッセージは割と賢いですが、よりわかりやすいメッセージで問題点を通知できるならそれに越したことは無いです。 `static_assert` はそういうものです。