Tôi đang sử dụng c ++ 17 với Boost.hana để viết một số chương trình lập trình meta. Một vấn đề khiến tôi băn khoăn là loại biểu thức nào có thể được sử dụng trong ngữ cảnh constexpr như static_assert. Đây là một ví dụ:
#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);
}
}
Đầu tiên tôi viết một lớp X với dữ liệu trường và một hàm truy cập getData () . Trong chính () phần test1 của , x1.data và x1.getData () hoạt động giống như tôi mong đợi. Nhưng trong phần test2 , việc thay đổi đối số thành tuple boost :: hana, static_assert(x2.data[0_c] == 1_c)
vẫn hoạt động tốt nhưng static_assert(x2.getData()[0_c] == 1_c)
không biên dịch được, với lỗi ' đọc biến không phải là constexpr' x2 'không được phép trong biểu thức không đổi '. Những gì chúng tôi đã làm là nếu tôi tách x2.getData()[0_c]
ra auto data = x2.getData();
và static_assert(data[0_c] == 1_c);
nó biên dịch lại tốt. Tôi mong họ cư xử như vậy. Vì vậy, bất cứ ai có thể giúp giải thích tại sao x2.getData()[0_c]
không thể được sử dụng trong static_assert trong ví dụ này?
Để sao chép: clang ++ 8.0 -I / path / to / hana-1.5.0 / bao gồm -std = c ++ 17 Test.cpp