intからint64_tへのキャスト時にg ++またはclangで警告を有効にすることはできますか? 例:gccまたはclangのintからint64_tへの変換時の警告を有効にする方法
int n;
cin >> n;
int64_t power = (1 << n);
私は、コンパイラは三行目では、この変換について私に告げることをしたいです。
intからint64_tへのキャスト時にg ++またはclangで警告を有効にすることはできますか? 例:gccまたはclangのintからint64_tへの変換時の警告を有効にする方法
int n;
cin >> n;
int64_t power = (1 << n);
私は、コンパイラは三行目では、この変換について私に告げることをしたいです。
あなたはこれらのラインに何かを構築することができます:
struct my_int64
{
template<class Y> my_int64(const Y&)
{
static_assert(false, "can't do this");
}
template<> my_int64(const long long&) = default;
/*ToDo - you need to hold the data member here, and
supply necessary conversion operators*/
};
その後
int n = 3;
my_int64 power = (1LL << n);
コンパイルが、
my_int64 power = (1 << n);
はしません。その意味では、これは良い出発点です。プリプロセッサーをハックしてint64_t
の代わりに使用することができます。
あなたはエラーではなく警告を望んでいた場合、あなたはstatic_assert
my_int64 x{}; Y y = x;
と希望コンパイラを置き換えることができますが変換を狭くに対して警告を発し、二つの文を最適化するために、それを信頼します彼らは集合的にノーオペレーションであるからです。
はい、私はそのアイデアが気に入っています。しかし、おそらくstatic_assertは私が探しているものではないでしょう。 –
@SukhanovNiсkolay_ "私はちょうど警告したいので、"あなたは厄介です。 'static_assert()'を 'static_assertion_warn()'のようなものに書き直す必要があるのではないかと思います。それを楽しんでください。 –
OK。それは金曜日です。それのためのアイデアを貼り付けた。 – Bathsheba
アップキャストで警告が表示されないのはなぜですか? – NathanOliver
3番目の文は構文的には有効ではありません。修正できますか? – Bathsheba
'(1LL << n)'があなたが実際に望むものなので、警告が必要だと思います。 –