2016-07-26 59 views
2

听说noexcept将成为C++ 17中的功能类型的一部分的一部分。这会有什么不同?这是否意味着我们必须在我们的模板中区分noexcept和非noexcept函数和成员函数(这将使我们必须编写的样板代码的数量翻倍)?noexcept成为类型系统

例如,对于当前的模板匹配函数指针:

template<typename R, typename... Args> 
struct Foo<R (*)(Args...)> {}; 

我们将需要额外的:

template<typename R, typename... Args> 
struct Foo<R (*)(Args...) noexcept> {}; 

而这仅仅是良好的旧功能。对于成员函数,我们有const,volatile和ref-qualifiers,这会产生巨大的组合负载。随着noexcept的加入,它会变差两倍。

+0

在哪个模板?举一个你觉得需要改变的代码的例子。 –

+0

@NicolBolas查看更新。 –

+0

“*对于成员函数,我们已经有const,volatile和ref-qualifiers,产生了巨大的组合负载。*”有人真的*使用* volatile用于他们的CV限定符吗?多久你需要采用一个'&'或'&&'类型的成员指针? –

回答

2

如果他们盲目地改变了一些事情,这样noexcept资格是一个函数指针的类型的一部分,他们将有破万吨代码,通用的,。因此,有一个后门。

In accord with P0021R1,任何指向noexcept限定函数的指针都可以隐式转换为指向非noexcept限定函数的指针。具有这种资格的成员函数的指针也是一样。

事实上,构建漏洞似乎正是约2 /在提案中语言的三分之二是。

+0

因此,这意味着当前模板可以匹配非'nnxcept'和'noexcept'函数,而指定'noexcept'的模板将仅匹配'noexcept'函数? –

+0

@ZizhengTai:现在的代码基本上可以像以前一样工作。例如,你的上面的结构没有使用模板来“匹配”任何东西(至少,而不是模板参数的扣除)。您明确指定了模板类型,这就是模板使用的内容。 –

1

除了@NicolBolas回答我想,鉴于两个专业指出:

// 1 
template<typename R, typename... Args> 
struct Foo<R (*)(Args...)> {}; 

// 2 
template<typename R, typename... Args> 
struct Foo<R (*)(Args...) noexcept> {}; 

然后Foo<decltype(fun)>将匹配第一个为

int fun1(int) {} 

和第二个用于

int fun2(int) noexcept {} 

还给出两个重载(不用说,我们将能够对超载异常规范,因为这将改变一个参数的类型):

int foo(int (*a)(int)); // 1 
int foo(int (*a)(int) noexcept); // 2 

编译器会选择为fun1所述第一过载和第二对fun2