c++ - cppreference noexcept



함축적으로 생성 된 멤버 및 noexcept (1)

최근에 가능한 noexcept 사양을 추가하여 가능하면 생성자 / 할당을 이동하기 시작했습니다. 이제 암시 적으로 생성 된 멤버 함수의 예외 사양이 어떻게 생겼는지 궁금해하기 시작했습니다. noexcept 이동 함수를 사용하면보다 효율적인 코드 경로를 사용할 수 있기 때문에 (예 : vector 크기를 조정할 때) 가능할 때마다 noexcept로 선언되기를 바랍니다. 그 표준에 대해 무엇을 말해야하는지 이해하는데 문제가있어서 g ++ 4.6 ( -std=c++0x )에서 다음 코드를 시도해 보았습니다.

struct foobar{};
int main()
{
    foobar a, b;
    std::cout<<std::boolalpha
             <<noexcept(foobar())<<", "<<noexcept(foobar(a))<<", "
             <<noexcept(a = b)   <<", "<<noexcept(a = std::move(b))<<", "
             <<noexcept(foobar(std::move(a)))<<std::endl;
}

이것은 나에게 True, True, True, False, False 의 출력을 주었고, 기본 및 복사 생성자 / 할당을 의미합니다.

내 질문에 대한 지금 :

어떤 상황에서 noexcept 선언 된 암시 적 생성 (또는 기본값) 멤버 함수가 있습니까? 또한 foobar 대한 obseved 동작이나 gcc4.6의 컴파일러 버그가 있습니까?


라이브러리 버그 - gcc 4.7에서 true, true, true, true, true 를 표시합니다.

그리고 버그는 생성 된 이동 생성자가 noexcept가 아니지만 std::movenoexcept 로 표시되어 있지 않다는 것을 의미합니다. 추가 테스트에서 확인할 수 있습니다.

std::cout << noexcept(a = static_cast<foobar&&>(b)) << ", "  // true
          << noexcept(foobar(static_cast<foobar&&>(b))) << ", " // true
          << noexcept(std::move(b)) << std::endl;   // false

gcc 4.6의 라이브러리 함수 대부분은 noexcept-correct가 아니며 gcc 4.7 에서 다루었습니다.

암시 적으로 생성 된 멤버 함수가 noexcept 인 경우, 이것은 15.4 / 14에 문서화되어있다. 기본적으로 호출해야 할 모든 함수가 모두 noexcept 인지 여부는 noexceptnoexcept .

암묵적으로 선언 된 특수 멤버 함수 (12 절)는 예외 명세를 가져야한다. f 가 암시 적으로 선언 된 기본 생성자, 복사 생성자, 이동 생성자, 소멸자, 할당 할당 연산자 또는 이동 대입 연산자 인 경우, 그 암시 적 예외 사양T예외 사양 에서 허용되는 경우에만 유형 ID T 지정합니다. f 의 암시 적 정의에 의해 직접 호출되는 함수. f 는 직접 호출하는 함수가 모든 예외를 허용하는 경우 모든 예외를 허용 하고 f 는 직접 호출하는 모든 함수가 예외를 허용하지 않으면 예외를 허용하지 않습니다.





language-lawyer