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