考慮這個簡單的模板專業化:模板偏特非類型參數:GCC VS MSVS
template<typename T, size_t I>
struct S {};
template<typename T>
struct S<T, std::tuple_size<T>::value> {};
GCC不能編譯它,因爲它使用模板參數T
在模板參數std::tuple_size<T>::value
:
error: template argument 'std::tuple_size<_Tp>::value' involves template parameter(s)
現在,讓我們在tuple_size
模板參數與typename std::remove_reference<T>::type
替換T
:
// Using primary structure template from previous example.
template<typename T>
struct S<T, std::tuple_size<typename std::remove_reference<T>::type>::value> {};
該代碼仍然在模板參數中使用模板參數,但GCC編譯時沒有任何錯誤或警告。爲什麼?
non-type parameter of a partial specialization must be a simple identifier
這是什麼奇怪的限制:
現在,如果我們試圖編譯使用MSVS的第二個例子是/std:c++latest
標誌,它與錯誤C2755停止?當I
等於元組大小時,我想停止編譯時遞歸。
那麼他們是誰錯了:MSVS還是GCC?
注意MSVS即使沒有任何模板實例報告錯誤,而GCC正常工作與所有這些實例:
S<std::tuple<int, float>, 9> s1;
S<std::tuple<int, float>, 2> s2;
S<int, 42> s3;
我使用MSVS社區2015年更新3與它的默認編譯器和GCC 6.2.1。
嘗試鏗鏘3.8.0。它不具有類似於GCC的消息的錯誤編譯兩個片段:
error: non-type template argument depends on a template parameter of the partial specialization