Apa aturan yang std::is_constructiblemenangani 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, Ttidak dapat dibangun secara default.
Membatalkan komentar pada baris yang dikomentari, ia mencetak 11( ideone ), jadi Ttiba-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_constructiblebenar-benar tidak konsisten?
::valueversi 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.
falsetetapi jika templat fungsi tidak dicommentasikan, tiba-tiba kembali true: godbolt.org/z/zqxdk2
00