#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不适用于后一种情况?
可能是这种情况,因为'A :: m'是一个不可推论的上下文。 –
Pixelchemist
如果是这样,为什么前一种情况好吗? – xmllmx
由于参考折叠和'remove_pointer'没有效果。 – Pixelchemist