Windows上的C++ 17是否与ubuntu上的C++ 17一致?

ser*_*rup 1 c++ visual-studio c++-concepts c++17

我试图移植一些我在ubuntu上制作的C++ 17代码(gnu ++ 11)

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));
}
Run Code Online (Sandbox Code Playgroud)

这段代码在ubuntu上编译和工作正常,但是当尝试使用visual studio 2017(v141)[ISO C++最新草案标准(/ std:c ++ latest)]在Windows上编译时,我得到以下内容:

错误C3533:参数不能包含'auto'的类型

我想也许它与在当前的C++ 17版本中没有实现的Concepts lite有关,或者这是错的?

如果我可以设置编译器使用auto作为参数和参数包,那么这将是最好的,但如果这是不可能的,那么我将不得不重写我的代码遵循C++ 17 windows标准 - 任何关于如何做的建议这没有在模板地狱中结束

Tri*_*dle 8

void addexecutorfunc( Func callback, const auto&...args )
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

哪个应该按预期工作.

  • @serup概念TS在参数列表中允许`auto`,尽管从内存中语义与GNU扩展的不同.是否应该允许这种"缩写函数[模板]语法"是目前标准委员会内部的一个主要争论点,目前尚不清楚它是否最终成为C++ 20的一部分.截至上次会议,这是不允许的,但这可能会在未来3年内改变一段时间. (3认同)