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 주석 처리 된 주석 처리를 제거하고 gcc에서 모두 1 : s가됩니다.
false
되지만 함수 템플릿의 주석 처리가 없으면 갑자기 반환합니다 true
. godbolt.org/z/zqxdk2
00