2015-02-24 44 views
1

VS 2013說,它不能專注於以下代碼的函數模板:VS 2013不擅長與依賴於模板參數中通用的基準和返回類型函數模板

struct W { }; 

template <class T> 
typename T::result_type 
f (const W & w, T && t) { 
    return 0; 
} 

/* ... */ 
struct V { typedef int result_type; }; 

W w {}; 
V v {}; 
f (w, v); 

如果我通過int或者更換typename T::result_type我用T&替換通用參考T&&,它不會抱怨。

在我看來,上面的代碼是正確的。這是一個編譯器錯誤,還是我做錯了什麼?

回答

2

編譯器是正確的。工作的途徑(1)的工作是如果通過類型U的左值,他們使用U&而不是U進行類型推導。由於v在你的情況是一個左值,T推導爲V&V&是一個引用類型,它沒有嵌套類型(它甚至不能有一個)。

當轉發引用的工作,你必須總是使用std::remove_reference獲得的基本類型:

template <class T> 
typename std::remove_reference<T>::type::result_type 
f (const W & w, T && t) { 
    return 0; 
} 

(1)由於CppCon 2014年,「轉發引用」被接受作爲替代任期「通用參考」,因爲它更好地捕捉了意圖。

+0

非常感謝!我絕不會想到這個。我會盡快接受你的回答。 – JohnB 2015-02-24 10:48:46

相關問題