使用/ std:c ++ latest(或C ++ 17 / N4190)

时间:2016-09-07 07:26:58

标签: c++ visual-c++ boost visual-studio-2015 c++17

当我尝试使用带有/std:c++latest标志的MSVC2015构建boost时出现错误:

boost\algorithm\string\detail\case_conv.hpp(33): error C2143: syntax error: missing ',' before '<'

指向:

 // a tolower functor
 template<typename CharT>
 struct to_lowerF : public std::unary_function<CharT, CharT>

现在这似乎是由于这里提到的N4190:https://www.visualstudio.com/en-us/news/releasenotes/vs2015-update3-vs

  

/ std:c ++ latest还控制了以下旧版本的删除   功能:N4190“删除auto_ptr,random_shuffle()和旧东西”,   P0004R1“删除过时的Iostreams别名”,LWG 2385   “function :: assign allocator参数没有意义”,各种各样   非标准功能(std :: tr1命名空间,仅限TR1   机器,以及std :: identity struct)。

使用时:

 std::string a,b;
 return boost::iequals(a,b);

使用boost::ilexicographical_compare

这里也提到了:

https://blogs.msdn.microsoft.com/vcblog/2015/06/19/c111417-features-in-vs-2015-rtm/

Stephan T. Lavavej - MSFT

Azarien: Removing auto_ptr/etc. will have positive consequences. It will prevent new code from using outdated/complicated/unsafe
     机器,它将减少非专家用户之间的混淆。的(对于   例如,不必要的unary_function / binary_function继承   常见的,因为很多用户都认为是STL算法/容器   需要这个,实际上只有过时的适配器。)和   auto_ptr特别不安全,因为它的变异“复制”   构造函数默默地从左值移动。

那么如何使用VC2015的/ std:c ++最新版进行编译?现在看来,boost不兼容C ++ 17吗?

1 个答案:

答案 0 :(得分:9)

在包含任何标头之前定义宏_HAS_AUTO_PTR_ETC。对于您自己的代码,如果您使用的是Visual Studio的构建系统,最好通过项目的Preprocessor Definitions setting来完成。要构建Boost,请在define=_HAS_AUTO_PTR_ETC / b2调用中添加bjam

/std:c++latest隐式禁用的其他先前标准功能可以通过定义宏_HAS_FUNCTION_ASSIGN_HAS_OLD_IOSTREAMS_MEMBERS_HAS_TR1_NAMESPACE来控制。以下博客文章中概述了这些宏:

STL Fixes In VS 2015 Update 3
VS 2015 Update 2’s STL is C++17-so-far Feature Complete