2016-09-14 1 views
4

나는 type_traits 주변에 놀고 있었는데, 나는 std::string의이 이상한 특성을 발견 :std :: string not assign assignable 또는 comparable 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이 noexcept을 표시하는 move assignment operatorcomparison operators 주장합니다.

내가 잘못 했나요? 이거 버그 야?

+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-branch로 백 포트했지만 그 이후로 GCC 5.x의 또 다른 릴리스는 없었습니다. 5.5 릴리즈에서 수정 될 때마다 수정 될 것입니다.

관련 문제