gpt4 book ai didi

c++ - std::string not nothrow move assignable or comparable?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:22 26 4
gpt4 key购买 nike

我在研究 type_traits 时,发现了 std::string 的这个奇怪属性:

$ cat a.cpp
#include <string>
#include <type_traits>

static_assert(std::is_nothrow_move_assignable<std::string>::value, "???");
static_assert(noexcept(std::declval<std::string>() == std::declval<std::string>()), "???");
$ g++ -std=c++14 a.cpp
a.cpp:4:1: error: static assertion failed: ???
static_assert(std::is_nothrow_move_assignable<std::string>::value, "???");
^
a.cpp:5:1: error: static assertion failed: ???
static_assert(noexcept(std::declval<std::string>() == std::declval<std::string>()), "???");
^
$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609

然而 cppreference 声称 move assignment operatorcomparison operators标记为 noexcept

我做错了什么吗?这是错误吗?

最佳答案

Yet cppreference claims the move assignment operator and comparison operators are marked noexcept.

有一个关于这个的缺陷报告,因为 C++11 说移动赋值是 noexcept 但一般来说这是不可能满足的(因为如果从一个字符串移动它可能需要重新分配不传播的不兼容分配器)。参见 DR 2063 .

标准已经固定,因此异常规范取决于分配器的属性,但是在 GCC 中实现新规则之前,我们没有进行操作 noexcept。我为 GCC 6.1 实现了固定规则(请参阅 PR 58265 )并将更改反向移植到 gcc-5-branch,但从那时起就没有再发布 GCC 5.x。每当发生这种情况时,它将在 5.5 版本中修复。

关于c++ - std::string not nothrow move assignable or comparable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39492855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com