簡體   English   中英

參數列表中的void_t有效,但不作為返回類型

[英]void_t in parameter list works but not as return type

關於使用別名的cppreference有一個例子。 此示例失敗,因為int沒有成員foo

template<typename...> using void_t = void;
template<typename T> void_t<typename T::foo> f();
f<int>(); // error, int does not have a nested type foo

這很清楚,但是當我嘗試將void_t部分放在參數列表中時,它意外地編譯了:

template<typename...> using void_t = void;
template<typename T> void f(void_t<typename T::foo>);
f<int>();

它編譯clang而不是gcc。 這是一個錯誤嗎?

template<class...>struct voider{using type=void;};
template<class...Ts>using void_t=typename voider<Ts...>::type;

C ++ 11標准中存在一個含糊不清的問題,即使用無效類型/表達式別名的模板的未使用模板參數是否是替換失敗。

gcc和clang對這個條款的解釋不同,這就是我認為你所看到的。 上面的void_t應該使它在gcc和clang中都一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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