首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模板中使用noexcept运算符

在模板中使用noexcept运算符
EN

Stack Overflow用户
提问于 2019-10-16 15:17:45
回答 1查看 113关注 0票数 0

我已经试着去理解更多的内容,比如noexcept运算符是如何工作的,以及如何在模板中使用它。我的目标是启用或禁用模板函数,这取决于成员函数类的noexcept类型。

代码语言:javascript
复制
class ObjTestNoExcept
{
public:
   ObjTestNoExcept() noexcept {}
   void Test() noexcept {}
};

class ObjTestExcept
{
public:
   ObjTestExcept() {}
   void Test() {}
};

template <class T, typename = typename std::enable_if_t<noexcept(T().Test()), T>>
void DoSomething()
{
   std::cout << "OK" << std::endl;
}

int main()
{
   DoSomething<ObjTestNoExcept>();
   DoSomething<ObjTestExcept>(); // error C2672: 'DoSomething': no matching overloaded function found
   return 0;
}

对于ObjTextExcept类,它按预期工作并禁用该函数;对于ObjTestNoExcept类,它按预期工作并启用该函数。

但是,如果我删除了ObjTestNoExcept类上的noexcept关键字,那么该函数将被禁用,而它仍然是noexcept。

代码语言:javascript
复制
class ObjTestNoExcept
{
public:
   ObjTestNoExcept() {}
   void Test() noexcept {}
};

template <class T, typename = typename std::enable_if_t<noexcept(T().Test()), T>>
void DoSomething()
{
   std::cout << "OK" << std::endl;
}

int main()
{
   DoSomething<ObjTestNoExcept>(); // error C2672: 'DoSomething': no matching overloaded function found
   return 0;
}

我不知道在构造函数中删除noexcept关键字有什么问题。

此代码是在Visual Studio 2017专业版15.6.3下开发的。

感谢您的阅读。

奥利维尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-16 15:23:05

如果表达式X为noexcept,则noexcept(X)为true。在第二个示例(noexcept(T().Test()))中,混合了两个部分:T的构造,然后是对Test方法的调用。这就是为什么从构造函数中删除noexcept会破坏代码。

若要避免假设没有异常的默认构造函数,请使用:noexcept(std::declval<T>().Test())

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

https://stackoverflow.com/questions/58407779

复制
相关文章

相似问题

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