อะไรคือกฎที่ใช้ในการstd::is_constructible
ก่อสร้างส่วนตัว? รับรหัสต่อไปนี้:
#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();
}
ภาพพิมพ์นี้0
( ideone ) T
คือไม่สามารถกำหนดค่าเริ่มต้นได้
ไม่ใส่เครื่องหมายในบรรทัดที่คอมเม้นต์มันจะพิมพ์11
( ideone ) ดังนั้นจึงT
กลายเป็นค่าเริ่มต้นที่สามารถสร้างได้
ฉันสามารถหาเหตุผลในการสนับสนุนผลลัพธ์ทั้งสอง แต่ฉันไม่เข้าใจว่าการรวมบรรทัดที่ถูกคอมเม้นต์นั้นเปลี่ยนแปลงผลลัพธ์ของวินาทีได้อย่างไร นี่คือสิ่งที่เรียก UB หรือไม่? นี่เป็นข้อผิดพลาดของคอมไพเลอร์หรือไม่? หรือstd::is_constructible
ว่ามันไม่สอดคล้องกันจริงๆ?
::value
เวอร์ชันนั้นสามารถเปลี่ยนผลลัพธ์ของผู้ที่มาก่อนหน้าได้เช่นกัน: godbolt.org/z/zCy5xU ยกเลิกการใส่เครื่องหมายบรรทัดที่คอมเม้นต์และทั้งหมดกลายเป็น 1: s ใน gcc
false
แต่ถ้าเทมเพลตของฟังก์ชั่นนั้นไม่ใส่เครื่องหมายถูกก็จะส่งคืนtrue
: godbolt.org/z/zqxdk2
00