2016-12-05 57 views
4

我讀了using function declaration,我想編譯最後一個例子。這是:可以編譯C++的編譯器17參數包的lambda繼承

#include <iostream> 
template <typename... Ts> 
struct Overloader : Ts... { 
    using Ts::operator()...; // exposes operator() from every base 
}; 

template <typename... T> 
constexpr auto make_overloader(T&&... t) { 
    return Overloader<T...>{std::forward<T>(t)...}; 
} 

int main() { 
    auto o = make_overloader([] (auto const& a) {std::cout << a;}, 
          [] (float f) {std::cout << 13 << f;}); 
} 

即使我已經知道並理解它會做什麼,我想編譯和測試它。 然而,clang-4.0和g ++ - 7.0目前似乎都無法編譯它。有任何編譯器可以試試嗎?

+3

如果GCC和Clang的最新版本都無法執行某些操作,則幾乎可以確保沒有其他編譯器可以(模塊化錯誤)。除非它是一個獨立的項目,否則可能是其中一個分支。 –

+1

此功能在一個月前投入工作草案。實施事情需要時間。 –

+0

@TC:我仍然不明白即使聲明列表功能被批准,OP的例子如何編譯。 'Overloader'不是一個聚合,因爲它有一個基類。另外,'make_overloader'正在接收一個通用的lambda,所以'Overloader'模板是否適當地處理這個?你能幫我嗎? – AndyG

回答

2

P0195,建議的語言擴展,它允許:

template <typename... Ts> 
struct Overloader : Ts... { 
    using Ts::operator()...; // <== ill-formed without p0195 
}; 

在伊薩誇才被接納進入C++幾個星期前(2016 11月)。 gcc或clang尚未實現它也就不足爲奇了。給他們時間。

現在的解決方法是爲創建線性層次結構。

+0

你從哪裏找到P0195的收養狀態?它在[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/](http://www.open-std.org/jtc1)上未標記爲「已採納」/sc22/wg21/docs/papers/2016 /) –

+1

@VittorioRomeo我相信[Botond](https://botondballo.wordpress.com/2016/11/25/trip-report-c-standards-meeting-in-issaquah 2016年11月 - ) – Barry

+1

線性?懶鬼。二進制! – Yakk