2015-01-14 1 views
4

템플릿을 noexcept 지정자와 함께 사용하면 일치하지 않는 noexcept 사양에 대한 오류가 발생합니다. gcc의 모든 버전에서 사용했던 clang의 다양한 버전과 fails으로 컴파일됩니다.noexcept 및 템플릿에서 가능한 g ++ 버그

struct Y 
{ 
    void h(); 
}; 

template<typename T> 
struct X 
{ 
    void f() noexcept(noexcept(std::declval<Y>().h())); 
}; 

template<typename T> 
void X<T>::f() noexcept(noexcept(std::declval<Y>().h())) 
{ 
} 

int main() 
{ 
} 

오류 :

g++ -std=c++1y -O2 -Wall -pthread main.cpp && ./a.out 

main.cpp:15:56: error: declaration of 'void X<T>::f() noexcept (noexcept (declval<Y>().Y::f()))' has a different exception specifier 
void X<T>::f() noexcept(noexcept(std::declval<Y>().f())) 
                ^
main.cpp:11:10: error: from previous declaration 'void X<T>::f() noexcept (noexcept (declval<Y>().Y::f()))' 
void f() noexcept(noexcept(std::declval<Y>().f())); 
    ^

이 버그인가요? 주위를 둘러 볼 방법이 있습니까?

+2

[유사한 알려진 버그] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56643)가 있습니다. –

답변

1

noexcept 연산자의 결과를 저장하기 위해 열거 형을 사용하면 현재 ideone에서 사용되는 적어도 gcc-4.9.2에서 workaround이 두렵다.

#include <iostream> 
#include <utility> 

struct Y 
{ 
    void h() noexcept; 
    void i(); 
}; 

enum Y_noexcept_value 
{ 
    h = noexcept(std::declval<Y>().h()), 
    i = noexcept(std::declval<Y>().i()) 
}; 

template<typename T> 
struct X 
{ 
    void f() noexcept(Y_noexcept_value::h); 
    void g() noexcept(Y_noexcept_value::i); 
}; 

template<typename T> 
void X<T>::f() noexcept(Y_noexcept_value::h) 
{ 
} 

template<typename T> 
void X<T>::g() noexcept(Y_noexcept_value::i) 
{ 
} 

int main() 
{ 
    std::cout << std::boolalpha 
       << noexcept(std::declval<X<int>>().f()) << std::endl 
       << noexcept(std::declval<X<int>>().g()) << std::endl; 
    return 0; 
}