Nó sẽ có thể xác minh rằng một danh sách initializer đang được chuyển đến một nhà xây dựng constexpr
là một kích thước nhất định? Hay điều này chỉ có thể thực hiện được khi chạy?Làm thế nào để static_assert rằng một danh sách initializer là một kích thước nhất định
Đây là ý tưởng, nhưng nó không hoạt động:
struct group
{
constexpr group(
std::initializer_list<std::initializer_list<UINT const> const> groups
)
{
static_assert(each_list_size_greater_than_1(groups.begin(), groups.end()));
}
constexpr static bool each_list_size_greater_than_1(
std::initializer_list<std::initializer_list<UINT const> const>::const_iterator const begin
, std::initializer_list<std::initializer_list<UINT const> const>::const_iterator const end)
{
return begin == end || begin->size() > 1 && each_list_size_greater_than_1(begin + 1, end);
}
};
Tôi đã nhìn std::initializer_list
thực hiện VS2015 và begin()
, end()
và size()
đều constexpr
chức năng.
Điều gì có nghĩa là câu lệnh cuối cùng của bạn: 'Cho đến nay, bạn có thể nhận được loại trả về khác nhau chỉ thay đổi đối số mẫu và/hoặc số của chúng.'? – Adrian
@Adrian: theo tiêu chuẩn C++ ít nhất tối đa C++ 1z, bạn không thể tạo các kiểu trả về khác nhau cho hàm dựa trên _value_ của đối số hàm. Bạn cần thay đổi _type_ của hàm để thay đổi kiểu trả về của hàm. Tôi nhận ra rằng bạn không quan tâm đến việc thực sự thay đổi kiểu trả về của một hàm mà chỉ sử dụng một giá trị đối số như là một 'constexpr'. Tuy nhiên, nếu một giá trị đối số có thể được sử dụng như một 'constexpr' trong một hàm có cùng giá trị có thể được sử dụng trong kiểu trả về, do đó làm cho một cái gì đó có thể hiện không được phép. –