previous question私はコンパイル時に特定の基本型の特定の変換(double
までの型の変換)が安全かどうかを調べようとしていました。それは同様に、 "安全な" 型で宣言され静的アサーションの定数でない式
#include <limits>
#include <vector>
template<class one>
class test {
typedef typename one::value_type v; //My code actually takes std:: containers, not the type directly, so get the type.
typedef std::numeric_limits<v> limits; //Easier to read
static_assert(limits::max()==v(double(limits::max())),"MEANINGFUL ERROR MESSAGE"); //See if the conversion works correctly
};
:
test<std::vector<int> > a;
それがうまくコンパイル
結局、私は次のコードを考え出しました。それはのような、正しく変換されないであろうタイプを指定してコンパイルされている場合でも:
test<std::vector<unsigned long long> > b;
よりもむしろ、私は予想通りアサーションを失敗し、それはグラムを使用して、エラー・メッセージ(++ 4.7.1と5.3でコンパイルに失敗します。 0)--std=c++11
で:
test2.cpp: In instantiation of ‘class test<std::vector<long long unsigned int> >’:
test2.cpp:11:40: required from here
test2.cpp:8:5: error: non-constant condition for static assertion
static_assert(limits::max()==v(double(limits::max())),"MEANINGFUL ERROR MESSAGE");
私はそれはまだ問題があるときのコンパイルではない(仕事を取得していると仮定しますが、limits::max()==v(double(limits::max()))
が一定の条件としてカウントされませんなぜ私はまだ把握することはできませんし、エラーメッセージが分かりにくいという事実は本当に好きではありません。何が間違っているのですか?
ありがとうございます!私はまだかかわらず、私はよりよい解決策を見つけることができます願ってい
#include <limits>
#include <vector>
template<class one>
class test {
typedef typename one::value_type v; //My code actually takes std:: containers, not the type directly, so get the type.
typedef std::numeric_limits<v> limits; //Easier to read
static_assert(double(limits::max())!=double(limits::max())+1),"MEANINGFUL ERROR MESSAGE"); //Once the value is large enough that integers are not exactly representable, x==x+1 for doubles.
};
:
定数式は未定義の動作を持つことはできません。例えば、 'double(ULONGLONG_MAX)'が元の値より大きい場合、結果をUBに変換しようとすると、定数式ではありません。 –
@KerrekSBああ、意味があります。だから、私がUBを呼び出さずにやろうとしていることをする方法はありますか?効果的に私はすべての整数 'i <= N'がdoubleとして正確に表現できるような最大の整数' N'を探しています。 – Chris
私はそれが['std :: numeric_limits :: digits'](http://en.cppreference.com/w/cpp/types/numeric_limits/digits)のためだと思います。 –