首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据模板参数将函数标记为noexcept

根据模板参数将函数标记为noexcept
EN

Stack Overflow用户
提问于 2019-11-15 02:59:06
回答 1查看 86关注 0票数 3

请看下面的代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
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(); }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-15 03:00:52

noexcept规范有一个接受布尔值的版本。

代码语言:javascript
复制
template <class T>
void my_func() noexcept(noexcept(T::some_method())) { T::some_method(); }

现在,基于表达式T::some_method(),它将有条件地设置为noexcept。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58864001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档