#include <iostream>
#include <type_traits>
template<typename T>
struct A
{
using m = std::remove_pointer_t<T>&;
};
template
<
typename T,
typename = std::void_t<>
>
struct Test
{
enum { value = 0 };
};
template<typename T>
struct Test<T, typename A<T>::m>
{
enum { value = 1 };
};
int main()
{
std::cout << Test<void*&>::value; // ok, output 0
std::cout << Test<void*>::value; // error : cannot form a reference to 'void'
}
첫 번째 경우는 0
을 출력합니다. 이는 기본 템플릿이 선택되었음을 의미합니다. 그래서 두 번째 경우는 전문 템플릿이 아닌 기본 템플릿을 선택해야한다고 생각합니다. 오류가 있어서는 안됩니다.SFINAE가 이러한 경우에 작동하지 않는 이유는 무엇입니까?
Test<void*&>
은 정상입니다. 저를 놀라게 한 것은 Test<void*>
가 좋지 않아야한다는 것입니다!
SFINAE은 왜 후자의 경우 작동하지 않습니까?
케이스 될 수있다. – Pixelchemist
그렇다면 왜 이전 사례는 괜찮습니까? – xmllmx
참조 축소로 인해 효과가없는 'remove_pointer'가 발생했습니다. – Pixelchemist