std::string是否不可移动赋值或比较?

5

我在尝试使用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声称移动赋值运算符比较运算符被标记为noexcept

我是否做错了什么?这是个bug吗?


可能只是实现不好。看起来在GCC 6中它可以工作 - Kerrek SB
可能是我的版本中出现了libstdc++的错误。我想知道使用的是哪个版本。 - 小太郎
1个回答

4
然而,cppreference声称移动赋值运算符和比较运算符被标记为noexcept。关于此事曾有一个缺陷报告,因为C++11表示移动分配是noexcept,但一般情况下这是不可能满足的(因为如果从具有不兼容分配器的字符串中移动,则可能需要重新分配)。请参见DR 2063。 标准已经修正,使得异常规范取决于分配器的属性,但在GCC实现新规则之前,我们并没有使操作成为noexcept。我为GCC 6.1实现了固定规则(请参见PR 58265),并将更改回溯到了gcc-5-branch,但自那以后没有发布过GCC 5.x的其他版本。无论何时发布5.5版,都将进行修复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接