在模板中使用 noexcept 运算符
Use of noexcept operator in template
我试图更多地了解noexcept 运算符的工作原理以及如何在模板中使用它。 我的目标是启用或禁用模板函数,具体取决于成员函数类之一的 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 类并禁用函数,它按预期工作 ObjTestNoExcept 类并启用函数。
但是,如果我删除 ObjTestNoExcept 类上的 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())
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 使用 noexcept 运算符 depenendet
- NOEXCEPT 函数调用运算符的说明符_Not_fn
- 在模板中使用 noexcept 运算符
- 查找所有移动构造函数和移动赋值运算符(特别是那些没有"noexcept"的运算符)
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- 如何在赋值运算符中使用 noexcept 与复制和交换成语
- 如何计算 noexcept() 运算符的结果