拿这个代码:

template <class T>
void my_func() { T::some_method(); }

int main() {
    std::cout << (noexcept(my_func<SomeClass>()) ? "noexcept" : "can throw") << std::endl;
    return 0;
}

这将始终打印出 my_func() 可以抛出的内容,即使 SomeClass::some_method() 被标记为 noexcept 。 (至少使用 gcc 7.4.0 和 -std=c++17)

有没有一种实用的方法可以让编译器根据模板参数检测函数是否为 noexcept

我能想到的唯一一个是使用 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(); }

但它占用大量空间并导致代码重复。

最佳答案

noexcept 规范有一个采用 bool 值的版本。

template <class T>
void my_func() noexcept(noexcept(T::some_method())) { T::some_method(); }

现在它将是有条件的 noexcept,基于表达式 T::some_method()

关于c++ - 根据模板参数将函数标记为 noexcept,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58864001/

10-15 09:09