#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