2015-01-14 32 views
4

當我將模板與noexcept說明符一起使用時,我得到關於不匹配的noexcept規範的錯誤。它編譯了我用過的各種版本的clang,以及所有版本的gcc中的fails可能的g ++錯誤,帶有noexcept和模板

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

有一個[類似已知的bug](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56643) –

回答

1

使用枚舉來存儲noexcept操作符的結果是一個可怕的workaround至少在目前由ideone使用的gcc-4.9.2中。

#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; 
}