[英]decltype((void)T{}) in template Partial Specialization not deduce?
template<typename T,typename U = void>
struct Test
{
static const int value = 0;
};
template<typename T>
struct Test<T, decltype((void)T{})>
{
static const int value = 2;
};
template<typename T>
struct Test<T*, decltype((void)T{})>
{
static const int value = 1;
};
int main(){
cout<<Test<int*>::value<<endl;
return 0;
}
gcc / clang上的代碼都得到錯誤:不明確,但是decltype更改為void_t是ok.why?
對我來說這看起來像編譯錯誤:你真的需要來自T{}
副作用嗎? decltype((void)T{})
的整個構造應該丟棄零初始化的T
,允許未評估的副作用 - 那么這種副作用的重點是什么,如果有的話?
如果你只使用void
簡化它,甚至省略整個第二種類型,問題就會立即消失( wandbox上的現場演示 ):
template<typename T, typename U = void>
struct Test
{
static const int value = 0;
};
template<typename T>
struct Test<T, void>
{
static const int value = 2;
};
template<typename T>
struct Test<T*, void>
{
static const int value = 1;
};
int main(){
std::cout << Test<int*>::value << "\n";
return 0;
}
也許我錯過了一些錯綜復雜的細節,但我嘗試了很多變種,包括std::declval
, std::result_of
,別名模板,typedef的組合,其中沒有一個給了我任何有意義的東西。
但是如果我們將decltype((void)T{})
部分移出:
template<typename T>
using wrap = decltype((void)T{});
template<typename T>
struct Test<T, wrap<T>>
{
static const int value = 2;
};
template<typename T>
struct Test<T*, wrap<T>>
{
static const int value = 1;
};
GCC大喊: ambiguous template instantiation for 'struct Test<int*, void>'
。 這對我來說是一個朝着錯誤方向發展的跡象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.