Які правила 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