c++ - 根据模板参数将函数标记为 noexcept

标签 c++ templates noexcept

拿这个代码:

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/

相关文章:

c++ - 如何在控制台程序中获取鼠标位置?

c++ - VC++ : Invalid template argument

python - TemplateDoesNotExist 错误 Django,它正在寻找正确的目录

C++ noexcept 规范取决于数据成员

c++ - std::shared_ptr 的 "owned pointer"和 "stored pointer"之间有什么区别?

c++ - 不同数据结构的速度/内存使用估计

c++ - 将函数调用表达式传递给 noexcept 有什么意义?

c++ - noexcept 指定函数不抛出的条件

c++ - 如何在 OS X 上的 Qt 应用程序中设置应用程序图标,足以分发?

c++ - 在不知道模板参数的映射中获取派生类的模板参数类型