c++ - std:: noexcept



basic_string:: swap이 noexcept가 아닌 이유는 무엇입니까? (1)

C ++ 11 Standard의 21.4.6.8 절은 다음을 지정합니다.

21.4.6.8 basic_string::swap [string :: swap]

void swap(basic_string& s);

1 사후 조건 : *이 문자는 s에있는 동일한 문자 시퀀스를 포함하고, s는 * this에있는 것과 동일한 문자 시퀀스를 포함합니다.

2 예외 : 아무것도 아니다 .

3 복잡성 : 일정 시간.

그러므로 noexcept 의 부재는 감독 noexcept 결론을 noexcept 않으면 noexcept .

또 다른 단서는 assign() 멤버 함수에 대한 단락 21.4.6.3에 있습니다.

basic_string& assign(basic_string&& str) noexcept;

효과 :이 함수는 *this 로 제어되는 문자열을 길이가 str.size() 인 문자열로 str.size() 이 요소는 str 의해 제어되는 문자열의 복사본입니다. [ 주의 : 유효한 구현은 swap(str) 입니다. - 끝말]

3 반환 값 : *this.

swap(str)assign() 의 유효한 구현으로 간주되고 assign() 이 무조건 noexcept 로 표시되면 swap()noexcept 로 간주하는 것이 noexcept .

방금 발견 한 basic_string (네임 스페이스 std의 멤버 함수와 함수)에 대한 두 스왑 함수가 noexcept로 선언되지 않았습니다. GCC-4.8의 표준 라이브러리 나 최신 C ++ 초안 N3690에서는 선언되지 않았습니다.

다른 한편, 이동 생성자와 이동 할당 연산자는 noexcept 로 선언됩니다. 이는 noexcept 스왑 기능을 제공 할 수 있어야한다는 것을 보여줍니다.

질문 : noexcept로 선언 된 스왑 함수를 사용하지 않는 이유는 무엇입니까?

업데이트 : 문제는 스왑이 실제로 noexcept인지 검사하기 위해 static_assert를 사용하는 자체 스왑 함수 내에서 템플릿 함수를 사용하고자하는 것입니다.

struct foo {
    bar_t bar;
    baz_t baz;
    void swap(foo& rhs) noexcept {
        swap_noexcept(bar, rhs.bar);
        swap_noexcept(baz, rhs.baz);
    }
};

그러나 스왑 함수가 noexcept 로 선언 된 경우에만 작동하며 basic_string 해당하지 않습니다.





c++11