2016-09-14 10 views
4

私はtype_traitsで遊んでた、と私はstd::stringのこの奇妙な性質を発見しました:std :: string nothrow move assignableまたはcomparable?

$ 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 operatorsnoexceptをマークされていると主張しています。

何か間違っていますか?これはバグですか?

+0

おそらく単なる実装ではありません。 GCC 6の[it works](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リリースで修正される予定です。

関連する問題