4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
Visual C++ 中的重大更改_weixin_34319817的博客-CSDN博客
来自 : CSDN技术社区 发布时间:2021-03-24

为了实现新的优化和调试检查 C 标准库的 Visual Studio 实现特意破坏了连续两个版本之间的二进制兼容性。 因此 在使用 C 标准库时 使用不同版本编译的对象文件和静态库不能混合在同一二进制文件 EXE 或 DLL 中 并且不能在使用不同版本编译的二进制文件之间传递 C 标准库对象。 这样混合会发出关于 _MSC_VER 不匹配的链接器错误。 _MSC_VER 是包含编译器主版本的宏 例如 Visual Studio 2013 的 1800。 此检查无法检测 DLL 混合 也无法检测涉及 Visual C 2008 或早期版本的混合。

STL 包含文件

对 STL 标头中的 include 结构进行了一些更改。 允许 STL 标头以未指定的方式相互包含。 一般情况下 应编写你的代码 以便其根据 C 标准谨慎包括其需要的所有标头 且不依赖于哪些 STL 标头包含哪些其他 STL 标头。 这使得代码可跨版本和平台进行移植。 至少更改 Visual Studio 2015 RC 的两个标头才会影响用户代码。 首先 string 不再包括 iterator 。 第二 tuple 现在用于声明 std::array 但不包括所有 array 这可能中断代码通过以下代码构造的组合 代码具有名为“数组”的变量 你具有 using 指令“using namespace std;” 和你包括含有 tuple 的 STL 标头 如 functional 其现在用于声明 std::array。

steady_clock

已更改 steady_clock 的 chrono 实现 以便满足 C 标准对稳定性和单一性的要求。 steady_clock 现在以 QueryPerformanceCounter 为基础 而 high_resolution_clock 现在是 steady_clock 的 typedef。 因此 在 Visual C 中 steady_clock::time_point 现在是 chrono::time_point steady_clock 的 typedef 但是 其他实现不一定是这种情况。

分配器和 const

现在 我们要求分配器进行相等/不等比较 以接受两端上的 const 参数。  如果你的分配器如下定义这些运算符

bool operator (const MyAlloc other)

你应更新这些以将它们声明为 const 成员。

bool operator (const MyAlloc other) const

const 元素

C 标准始终禁止 const 元素 如 vector const T 或 set const T 的容器。 Visual C 2013 及更早版本接受此类容器。 在当前版本中 此类容器无法编译。

std::allocator::deallocate

在 Visual C 2013 和早期版本中 std::allocator::deallocate(p, n) 忽略了传入用于 n 的参数。  C 标准始终要求 n 应等于作为第一个参数传递给调用分配 返回 p 的值。但是 在当前版本中将检查 n 的值。 在运行时 为 n 传递不同于标准要求的参数的代码可能会崩溃。

hash_map 和 hash_set

非标准标头文件 hash_map 和 hash_set 在 Visual Studio 2015 RC 中已被弃用 并且将在未来版本中移除。 请改用 unordered_map 和 unordered_set。

比较运算符和 operator()

关联容器 map 系列 现在要求其比较运算符具有可调用 const 的函数调用运算符。 现在比较运算符类声明中的以下代码无法进行编译

bool operator()(const X a, const X b)

若要解决此错误 请将函数声明更改为

bool operator()(const X a, const X b) const

类型特征

早期版本的 C 草稿标准中删除了类型特征的旧名称。 C 11 中已对这些进行了更改 并且已更新为 Visual Studio 2015 RC 中的 C 11 值。 下表显示了旧名称和新名称。

旧名称

新名称

add_reference

add_lvalue_reference

has_default_constructor

is_default_constructible

has_copy_constructor

is_copy_constructible

has_move_constructor

is_move_constructible

has_nothrow_constructor

is_nothrow_default_constructible

has_nothrow_default_constructor

is_nothrow_default_constructible

has_nothrow_copy

is_nothrow_copy_constructible

has_nothrow_copy_constructor

is_nothrow_copy_constructible

has_nothrow_move_constructor

is_nothrow_move_constructible

has_nothrow_assign

is_nothrow_copy_assignable

has_nothrow_copy_assign

is_nothrow_copy_assignable

has_nothrow_move_assign

is_nothrow_move_assignable

has_trivial_constructor

is_trivially_default_constructible

has_trivial_default_constructor

is_trivially_default_constructible

has_trivial_copy

is_trivially_copy_constructible

has_trivial_move_constructor

is_trivially_move_constructible

has_trivial_assign

is_trivially_copy_assignable

has_trivial_move_assign

is_trivially_move_assignable

has_trivial_destructor

is_trivially_destructible

launch::any 和 launch::sync 策略

已删除非标准的 launch::any 和 launch::sync 策略。 相反 对于 launch::any 请使用 launch:async | launch:deferred。 对于 launch::sync 请使用 launch::deferred。 请参阅launch 枚举。

本文链接: http://ndestructible.immuno-online.com/view-694589.html

发布于 : 2021-03-24 阅读(0)