我正在寻找阻止我的编译器(intel 15)对我的代码进行矢量化的原因。原因是:loop with early exits cannot be vectorized unless it meets search loop idiom criteria
虽然我没有break
或exit(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 !!*/
}
感谢。
答案 0 :(得分:0)
如果您查看noexcept
operator(强调我的)
如果表达式至少包含以下可能评估的结构之一,则结果为false:
- 调用任何类型的函数,该函数没有非抛出异常规范,除非它是一个常量表达式。
- 抛出表情。
- 当目标类型是引用类型时,dynamic_cast表达式,转换需要运行时检查
- 当参数类型为多态类类型时的typeid表达式
在所有其他情况下,结果都是正确的。
正如您所注意到的,让您的模板功能评估noexcept
为true
的方法只是将其声明为
template <typename T>
void A(T& a) noexcept
{
}