簡體   English   中英

模板中的decltype((void)T {})部分專業化不推斷?

[英]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::declvalstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM