Каковы правила, по которым 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