Các quy tắc mà std::is_constructible
xử lý các nhà xây dựng tư nhân là gì? Cho mã sau:
#include <iostream>
class Class {
private:
Class() { }
};
template <typename T>
class Test {
public:
static void test() {
std::cout
//<< std::is_constructible<Class>::value
<< std::is_constructible<T>::value
<< std::endl;
}
};
int main() {
Test<Class>::test();
}
Bản in này 0
( ideone ), nghĩa là, T
không thể xây dựng mặc định.
Không chú ý đến dòng nhận xét, nó in 11
( ideone ), do đó, hoàn toàn T
trở thành cấu trúc mặc định.
Tôi có thể tìm thấy lý do để hỗ trợ cả hai kết quả, nhưng tôi không hiểu cách bao gồm dòng nhận xét thay đổi kết quả của lần thứ hai. Đây có phải là bằng cách nào đó gọi UB? Đây có phải là một lỗi biên dịch? Hay là std::is_constructible
thực sự không nhất quán?
::value
phiên bản có khả năng thay đổi đầu ra của những người đến trước nó: godbolt.org/z/zCy5xU Bỏ ghi chú dòng nhận xét và tất cả trở thành 1: s trong gcc.
false
nhưng nếu mẫu hàm không bị lỗi, nó đột nhiên trả về true
: godbolt.org/z/zqxdk2
00