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