是否可以在g ++或clang中启用从int到int64_t的强制转换的警告? 例子:如何启用从int到int64_t在gcc或clang中的转换警告
int n;
cin >> n;
int64_t power = (1 << n);
我想要的编译器告诉我关于这个转换在第三行。
是否可以在g ++或clang中启用从int到int64_t的强制转换的警告? 例子:如何启用从int到int64_t在gcc或clang中的转换警告
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()'的东西,这只会导致编译器警告。玩得开心。 –
好的。这是星期五。为此提出了一个想法。 – Bathsheba
为什么你不想在一个upcast上发出警告? – NathanOliver
第三条语句在语法上不是有效的,请问您能纠正它吗? – Bathsheba
我假设你想要这个警告,因为'(1LL << n)'是你真正想要的。 –