Apa aturan yang std::is_constructible
menangani konstruktor pribadi? Diberikan kode berikut:
#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();
}
Cetakan ini 0
( ideone ), yaitu, T
tidak dapat dibangun secara default.
Membatalkan komentar pada baris yang dikomentari, ia mencetak 11
( ideone ), jadi T
tiba-tiba menjadi default dibangun.
Saya dapat menemukan alasan untuk mendukung kedua hasil, tetapi saya tidak mengerti bagaimana memasukkan baris komentar mengubah hasil yang kedua. Apakah ini entah bagaimana melibatkan UB? Apakah ini bug kompiler? Atau std::is_constructible
benar-benar tidak konsisten?
::value
versi ini mampu mengubah output dari yang datang sebelumnya juga: godbolt.org/z/zCy5xU Batalkan komentar pada baris yang dikomentari dan semuanya menjadi 1: dalam gcc.
false
tetapi jika templat fungsi tidak dicommentasikan, tiba-tiba kembali true
: godbolt.org/z/zqxdk2
00