windows 上的 C++17 是否与 ubuntu 上的 C++17 一致?
Is C++17 on windows in alignment with C++17 on ubuntu?
我正在尝试移植一些我在 ubuntu (gnu++11)
上编写的 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) 编译时++最新)],然后我得到以下信息:
error C3533: a parameter cannot have a type that contains 'auto'
我认为这可能与当前 C++17 版本中未实现的精简版概念有关,或者这是错误的?
如果我可以将编译器设置为使用 auto 作为参数和参数包,那将是最好的,但如果这不可能,那么我将不得不重写我的代码以遵循 C++17 windows 标准 - 关于如何在不陷入模板地狱的情况下执行此操作的任何建议
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)
这应该会按预期工作。
我正在尝试移植一些我在 ubuntu (gnu++11)
上编写的 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) 编译时++最新)],然后我得到以下信息:
error C3533: a parameter cannot have a type that contains 'auto'
我认为这可能与当前 C++17 版本中未实现的精简版概念有关,或者这是错误的?
如果我可以将编译器设置为使用 auto 作为参数和参数包,那将是最好的,但如果这不可能,那么我将不得不重写我的代码以遵循 C++17 windows 标准 - 关于如何在不陷入模板地狱的情况下执行此操作的任何建议
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)
这应该会按预期工作。