Trong các hàm constexpr của C ++ 11, một câu lệnh thứ hai như assert()
là không thể thực hiện được. A static_assert()
là tốt, nhưng sẽ không hoạt động nếu chức năng được gọi là chức năng 'bình thường'. Toán tử dấu phẩy có thể đến để giúp wrto. các assert()
, nhưng là xấu xí và một số công cụ nhổ cảnh báo về điều đó.
Hãy xem xét 'getter' như vậy hoàn toàn có thể tạo ra bên cạnh khẳng định. Nhưng tôi muốn giữ một số loại xác nhận cho thời gian chạy và biên dịch thời gian, nhưng không thể quá tải tùy thuộc vào bối cảnh 'constexpr'.
template<int Size>
struct Array {
int m_vals[Size];
constexpr const int& getElement( int idx ) const
{
ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11
// not possible, even in constexpr calls as being pointed out, but what I would like:
static_assert( idx < Size, "out-of-bounds" );
return m_vals[idx];
}
};
Điều kiện bên lề: C ++ 11, không heap, không có ngoại lệ, không có chi tiết cụ thể về trình biên dịch.
Lưu ý như các nhà bình luận đã chỉ ra (cảm ơn!), static_assert
Về lập luận là không thể (nhưng sẽ tốt đẹp). Trình biên dịch đã cho tôi một lỗi khác nhau khi truy cập ngoài giới hạn trong tình huống đó.
static_assert
phụ thuộc vàoidx
tất cả. Bạn chỉ có thể chẩn đoán một giá trị sai idx
nếu hàm được sử dụng trong ngữ cảnh yêu cầu biểu thức không đổi, bằng cách buộc đánh giá một cấu trúc làm cho nó không phải là biểu thức hằng. Ngoài bối cảnh như vậy, bạn không bao giờ có thể kiểm tra giá trị tại thời gian biên dịch.