I have made two test classes:
class Class1
{
public:
Class1(int a) {}
};
class Class2
{
public:
Class2() {}
};
template<typename T>
T* CreateInstanceTest(char*[!std::is_default_constructible<T>::value] = 0) { return nullptr; }
template<typename T>
T* CreateInstanceTest(char*[std::is_default_constructible<T>::value] = 0) { return new T(); }
Class1* obj1 = CreateInstanceTest<Class1>();
Class2* obj2 = CreateInstanceTest<Class2>();
It is an Intellisense error, not a build error. Intellisense is not perfect, however as a workaround you can improve deduction code:
template<typename T> typename ::std::enable_if_t
<
!::std::is_default_constructible<T>::value
, T *
>
CreateInstanceTest(void) { return nullptr; }
template<typename T> typename ::std::enable_if_t
<
::std::is_default_constructible<T>::value
, T *
>
CreateInstanceTest(void) { return new T(); }