C ++模板函数应该抛出异常吗?

时间:2017-07-19 13:08:13

标签: c++ exception noexcept

我正在寻找阻止我的编译器(intel 15)对我的代码进行矢量化的原因。原因是:loop with early exits cannot be vectorized unless it meets search loop idiom criteria虽然我没有breakexit(0)这样的内容。 所以我用noexcept运算符检查了我的所有函数,似乎我的所有模板函数都可能抛出异常(运算符一直返回false),尽管我没有尝试/ catch / throw。 出于这个原因,我在我的函数上指定了noexcept,现在它可以工作,但我不明白为什么编译器说他们可能会抛出一些东西?我如何指定,默认情况下,他们不会抛出任何东西?

示例:

/*.h*/
template <typename T>
void A(T& a){} /*does nothing*/

/*.cpp*/
#include ".h"
#include "MyClass.h"
int main(){
MyClass C;
noexcept(A(C)); /*Return false !!*/
}

感谢。

1 个答案:

答案 0 :(得分:0)

如果您查看noexcept operator(强调我的)

的文档
  

如果表达式至少包含以下可能评估的结构之一,则结果为false:

     
      
  • 调用任何类型的函数,该函数没有非抛出异常规范,除非它是一个常量表达式。
  •   
  • 抛出表情。
  •   
  • 当目标类型是引用类型时,dynamic_cast表达式,转换需要运行时检查
  •   
  • 当参数类型为多态类类型时的typeid表达式
  •   
     

在所有其他情况下,结果都是正确的。

正如您所注意到的,让您的模板功能评估noexcepttrue的方法只是将其声明为

template <typename T>
void A(T& a) noexcept
{
}