Quais são as regras pelas quais std::is_constructible
lida com construtores privados? Dado o seguinte código:
#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();
}
Isso imprime 0
( ideona ), ou seja, T
não é construtível por padrão.
Descomentando a linha comentada, ela imprime 11
( ideona ) e, de T
repente, tornou-se padrão construtível.
Eu pude encontrar um raciocínio para apoiar os dois resultados, mas não entendo como a inclusão da linha comentada altera o resultado do segundo. Isso está de alguma forma invocando o UB? Isso é um bug do compilador? Ou é std::is_constructible
realmente tão inconsistente?
::value
versão é capaz de alterar a saída daqueles que vieram antes: godbolt.org/z/zCy5xU Descomente a linha comentada e tudo se torna 1: s no gcc.
false
mas se o modelo da função não é comentado, ele retorna repentinamente true
: godbolt.org/z/zqxdk2
00