2017-12-18 69 views
9

我最近有代碼的問題是這樣的:爲什麼編譯器不能推導自動模板參數,除非我添加const?

constexpr auto lambda = []{}; 

template<auto& l> 
struct Lambda {}; 

template<auto& l> 
void test(Lambda<l>) {} 

int main() { 
    test(Lambda<lambda>{}); 
} 

兩個鐺和GCC告訴它不能推斷l

不過,如果我添加常數有:

// ----v 
template<const auto& l> 
void test(Lambda<l>) {} 

然後一切正常鏗鏘。 GCC仍然失敗。這裏發生了什麼事?它能否推導出const本身?這是一個海灣合作委員會的錯誤,它不會在這兩種情況下推斷l

回答

8

這是海灣合作委員會的錯誤,它不推斷l在這兩種情況下?

這是一個bug,對於Clang也是。對於一個佔位符類型的非類型參數,[temp.arg.nontype]/1說:

如果模板參數的類型包含的佔位符類型,的 推斷參數類型由佔位符的類型 模板參數的確定類型扣除。如果模板參數聲明 ([temp.param])不允許推導出 參數類型,則該程序不合格。

非常相同的過程,其中,將在這裏演繹

int main() { 
    auto& l = lambda; 
} 

l是const引用。

相關問題