2016-09-14 72 views
4

我玩弄type_traits,我发现了这个奇怪的std::string属性:std :: string nothrow move可分配或可比?

$ 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

我做错了什么?这是一个错误?

+0

也许只是一个不好的实现。在GCC 6中看起来像[它有效](http://melpon.org/wandbox/permlink/L8ZGpMveSiBnNj7a)。 –

+0

可能是我版本中的libstdC++错误。我想知道使用什么版本 –

回答

3

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

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

该标准已修复,以便异常规范取决于分配器的属性,但直到该新规则在GCC中实现为止,我们没有执行操作noexcept。我实现了GCC 6.1的固定规则(请参阅PR 58265),并将此更改反向移植到gcc-5分支,但从那时起,还没有另一个GCC 5.x版本。无论何时发生,它将在5.5版本中得到修复。

相关问题