在模板中使用 noexcept 运算符
Use of noexcept operator in template
我试图更多地了解 noexcept 运算符的工作原理以及如何在模板中使用它。
我的目标是启用或禁用模板函数,具体取决于成员函数 class 的 noexcept 类型。
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 class 正常工作并禁用该功能,ObjTestNoExcept class 正常工作并启用该功能。
但是,如果我在 ObjTestNoExcept class 上删除 noexcept 关键字,那么该功能将被禁用,但它仍然是 noexcept。
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 Professional Version 15.6.3下开发的。
感谢阅读。
奥利维尔
如果表达式 X
为 noexcept,则 noexcept(X)
为真。在第二个示例 (noexcept(T().Test())
) 中,两件事混合在一起:构造 T
,然后调用 Test
方法。这就是为什么从构造函数中删除 noexcept 会破坏代码。
为避免假定默认构造函数为 noexcept,请使用:noexcept(std::declval<T>().Test())
我试图更多地了解 noexcept 运算符的工作原理以及如何在模板中使用它。 我的目标是启用或禁用模板函数,具体取决于成员函数 class 的 noexcept 类型。
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 class 正常工作并禁用该功能,ObjTestNoExcept class 正常工作并启用该功能。
但是,如果我在 ObjTestNoExcept class 上删除 noexcept 关键字,那么该功能将被禁用,但它仍然是 noexcept。
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 Professional Version 15.6.3下开发的。
感谢阅读。
奥利维尔
X
为 noexcept,则 noexcept(X)
为真。在第二个示例 (noexcept(T().Test())
) 中,两件事混合在一起:构造 T
,然后调用 Test
方法。这就是为什么从构造函数中删除 noexcept 会破坏代码。
为避免假定默认构造函数为 noexcept,请使用:noexcept(std::declval<T>().Test())