私はいくつかのメタプログラミングプログラムを書くためにBoost.hanaでc ++ 17を使用しています。私を悩ませた1つの問題は、static_assertのようなconstexprコンテキストで使用できる式の種類です。次に例を示します。
#include <boost/hana.hpp>
using namespace boost::hana::literals;
template <typename T>
class X {
public:
T data;
constexpr explicit X(T x) : data(x) {}
constexpr T getData() {
return data;
}
};
int main() {
{ // test1
auto x1 = X(1_c);
static_assert(x1.data == 1_c);
static_assert(x1.getData() == 1_c);
}
{ //test2.1
auto x2 = X(boost::hana::make_tuple(1_c, 2_c));
static_assert(x2.data[0_c] == 1_c);
// static_assert(x2.getData()[0_c] == 1_c); // read of non-constexpr variable 'x2' is not allowed in a constant expression
}
{ //test2.2
auto x2 = X(boost::hana::make_tuple(1_c, 2_c));
auto data = x2.getData();
static_assert(data[0_c] == 1_c);
}
}
まず、フィールドデータとアクセサーgetData()を使用してクラスXを記述します。でメイン()のTEST1の一部、x1.data及びx1.getData()私は予想通り同じ挙動。しかし、中にTEST2の一部、ブースト::花のタプルの引数を変更し、まだ罰金に動作しますが、「のエラーで、コンパイルを失敗X2非constexprの変数の読み込み『』の定数式では許可されていません」。私は分割する場合はどうweiredことはありにし、それがうまく再コンパイルします。彼らは同じように振る舞うと思います。それで、誰もがこの例のstatic_assertで使用できない理由を説明するのを助けることができますか?static_assert(x2.data[0_c] == 1_c)
static_assert(x2.getData()[0_c] == 1_c)
x2.getData()[0_c]
auto data = x2.getData();
static_assert(data[0_c] == 1_c);
x2.getData()[0_c]
再現するには:clang ++ 8.0 -I / path / to / hana-1.5.0 / include -std = c ++ 17 Test.cpp