2017-09-26 52 views
1

我想端口一些C++ 17個代碼我在Ubuntu做(GNU + 11)Windows上的C++ 17是否與Ubuntu上的C++ 17保持一致?

typedef boost::variant<int, float, std::string > Variant; 
using Func = std::function<std::vector<unsigned char>(std::vector<Variant>)>; 

void addexecutorfunc(Func callback, const auto&...args) 
{ 
    std::vector<Variant> vec = {args...}; 
    executor.add(vec, std::move(callback)); 
} 

這個代碼編譯和ubuntu上工作正常,但試圖在Windows編譯與Visual Studio 2017年時, (V141)[ISO C++的最新標準草案(/ STD:C++最新的),然後我得到如下:

錯誤C3533:參數不能包含 '自動'

類型

我想也許它與Concepts lite沒有關係在當前的C++ 17版本中實現還是這是錯誤的?

如果我可以設置編譯器使用自動作爲參數和參數包,那將是最好的,但如果這是不可能的,那麼我將不得不重寫我的代碼以遵循C++ 17窗口標準 - 任何建議如何做到這一點沒有在模板地獄

+1

假設你正在談論GCC和MSVC,爲什麼不使用MinGW的? – Quentin

+0

我也可以只使用Cygwin的,但我希望有一個乾淨的Windows C++解決方案 – serup

+0

但給定的代碼似乎並沒有一個有效的,即使'GNU + 11'。你的意思是'gnu ++ 17'嗎? – VTT

回答

8
void addexecutorfunc(Func callback, const auto&...args) 

auto作爲參數傳遞給一個(非lambda)函數是GNU擴展結束了。它不是標準C++ 17的一部分,也不受其他兩種主要的C++編譯器Clang和MSVC支持。相反不幸的是,GCC似乎允許它-std=c++14模式以及與-std=gnu++14

標準C++相當於將一個函數模板

template <typename... Ts> 
void addexecutorfunc(Func callback, const Ts&... args) 

預期這應該工作。

+0

你認爲這個GNU擴展與Concepts Lite相同嗎?你認爲它會永遠支持MSVC? – serup

+3

@serup Concepts TS允許在參數列表中使用'auto',但是從內存來看,語義不同於GNU擴展的功能。這個「縮寫函數[模板]語法」是否應該被允許是標準委員會目前討論的主要問題,目前還不清楚是否最終成爲C++ 20的一部分。截至上次會議,這是不允許的,但這可能會在未來3年改變一段時間。 –