std :: string not nothrow移动可分配或可比较?

时间:2016-09-14 14:21:39

标签: c++ typetraits

我正在玩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

我做错了吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:3)

  

然而,cppreference声称移动赋值运算符和比较运算符标记为noexcept

有一个关于此的缺陷报告,因为C ++ 11表示移动分配是noexcept但是通常不可能满足(因为如果从具有不兼容分配器的字符串移动它可能需要重新分配那不会传播)。请参阅DR 2063

标准已经修复,因此异常规范取决于分配器的属性,但是在GCC中实现新规则之前,我们没有进行操作noexcept。我实现了GCC 6.1的固定规则(参见PR 58265)并将更改向后移植到gcc-5-branch,但此后还没有另一个GCC 5.x版本。只要发生这种情况,它将在5.5版本中修复。