2017-10-06 59 views
8

考慮這樣一個例子:能夠保證所有的模板,模板參數調用用戶提供扣除引導

#include <type_traits> 
#include <string> 

template <template <class> class TT> //#1 
struct Foo { 
    static void foo() { 
     static_assert(std::is_same_v<decltype(TT("abc")), TT<std::string>>); 
    } 
}; 

template <class T> 
struct Bar { 
    Bar(T) {} 
}; 

template <class T> 
Bar(T) -> Bar<std::string>; //#2 

int main() { 
    Foo<Bar>::foo(); 
} 

[clang]以及[gcc]似乎都使用用戶提供的扣除指南(#2)推導模板的模板參數時模板參數(#1)。它是符合標準的功能嗎?

回答

4

是的,這符合標準。

根據[dcl.type.simple]/2

類型說明符的形式typename選擇的嵌套名稱說明符選擇模板名稱爲推導的類類型的佔位符([dcl.type.class.deduct])。 模板名稱應命名不是注入類名的類模板。

而且[temp.param]/3

類型參數其標識符不遵循省略號限定其標識符是一個的typedef名(若無template聲明)或模板名稱(如果在template中聲明)在模板聲明的範圍內。

TTtemplate聲明的類型參數,這使得它成爲模板名稱並且因此對於一個推導的類類型的佔位符。所有通常的規則都適用。

+0

我真的期待這個答案,但是如果碰巧是錯誤的,那麼我會把它拿回來;) –

+0

作爲一個小問題:你認爲自動演繹指南不應該被應用嗎? –

+0

@ W.F。好吧,我徹底翻轉了答案:) – Barry