Take this code:
template <class T>
void my_func() { T::some_method(); }
int main() {
std::cout << (noexcept(my_func<SomeClass>()) ? "noexcept" : "can throw") << std::endl;
return 0;
}
This will always print out that my_func() can throw, even if SomeClass::some_method() is marked as noexcept. (at least with gcc 7.4.0 and -std=c++17)
Is there a practical way to make the compiler detect if the function is noexcept or not depending on the template argument ?
The only one that I can think of is using std::enable_if :
template <class T>
std::enable_if_t<true == noexcept(T::some_method())>
my_func() noexcept { T::some_method(); }
template <class T>
std::enable_if_t<false == noexcept(T::some_method())>
my_func() { T::some_method(); }
But it takes a lot of space and causes code repetition.
noexcept specifications have a version taking a boolean.
template <class T>
void my_func() noexcept(noexcept(T::some_method())) { T::some_method(); }
Now it will be conditionally noexcept, based on the expression T::some_method().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With