tôi đi qua với mã này trong một thực hiện std::optional
:biểu thức kích thước này được đánh giá như thế nào? và tại sao nó được gọi như vậy?
template <class T, class U>
struct is_assignable
{
template <class X, class Y>
constexpr static bool has_assign(...) { return false; }
template <class X, class Y, size_t S = sizeof((std::declval<X>() = std::declval<Y>(), true)) >
// the comma operator is necessary for the cases where operator= returns void
constexpr static bool has_assign(bool) { return true; }
constexpr static bool value = has_assign<T, U>(true);
};
Phần mà tôi không thể hiểu cách thức hoạt động hoặc làm thế nào nó được đánh giá là size_t S = sizeof((std::declval<X>() = std::declval<Y>(), true))
Tôi biết rằng nếu hoạt động assign thất bại nó sẽ rơi trở lại định nghĩa đầu tiên của has_assign trả về false, nhưng tôi không biết tại sao nó có phần , true)
.
Tôi đã thực hiện một số thử nghiệm với cấu trúc trả về khoảng trống trên toán tử gán và xóa phần , true
trong sizeof
mang lại cho tôi kết quả tương tự.
http://en.cppreference.com/w/cpp/language/sfinae. Nếu biểu thức bên trong 'sizeof' là hợp lệ cho' X' và 'Y' đã cho, thì có hai quá tải của' has_assign' và giá trị thứ hai được chọn cho 'has_assign (true)' như một kết hợp tốt hơn. Nếu biểu thức là vô nghĩa, thì tình trạng quá tải đó bị loại bỏ, và quá trình đầu tiên được chọn. –
Một số trình biên dịch xác định 'sizeof (void) == 1' làm phần mở rộng. Bật thêm cảnh báo. – Quentin
Sẽ trực tiếp hơn để chỉ viết 'class S = decltype (std :: declval() = std :: declval ())'. Chúng tôi không quan tâm những gì 'S' là anyway, chỉ là biểu thức đó là hợp lệ. –
Barry