私は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 operatorとcomparison operatorsがnoexcept
をマークされていると主張しています。
何か間違っていますか?これはバグですか?
おそらく単なる実装ではありません。 GCC 6の[it works](http://melpon.org/wandbox/permlink/L8ZGpMveSiBnNj7a)のように見えます。 –
私のバージョンではlibstdC++バグかもしれません。私はどのバージョンを使用するのだろうか –