演绎指南是否需要noexcept说明符?
出于某些原因,我一直认为演绎指南必须具有noexcept它们所引用的构造函数的相同性。例如:
template<typename T>
struct clazz {
clazz(const T &) noexcept {}
};
clazz(const char &) noexcept -> clazz<int>;
也就是说,如果构造函数是noexcept并且我也希望它也是 for const char &,我还必须将说明noexcept符添加到演绎指南中。
今天我和 ICC 合作了一下,发现它noexcept在扣除指南上有问题。到现在为止还挺好。我认为这是编译器的错误,仅此而已。
然而,我去研究了标准,找不到任何可以证实我最初假设的点。因此,我对 clang 进行了相同的检查,即使它没有问题,但似乎noexcept在 100% 的情况下,扣除指南上的 。另一方面,构造函数中的那个会影响两者。
所以,我的问题是,它使任何意义还是需要有点传播(如果这根本是有道理的)的noexcept构造函数的-ness还要扣除引导或者是无用的,我可以摆脱所有的noexcept上扣除指南?
回答
演绎指南的语法在[temp.deduct.guide]/1 中定义为
explicit-specifier(opt) template-name ( parameter-declaration-clause ) -> simple-template-id ;
正如您所看到的,它不包含异常说明符。
这确实有道理。演绎指南实际上并没有构建任何东西。它只是用来告诉编译器如何从一组参数中获取模板参数。您有一个两步过程,推导指南通过重载决议运行以确定模板参数,然后使用这些推导的模板参数枚举构造函数,并针对构造函数运行重载决议。
- @skypjack Yep. It's a heck of a lot less egregious then GCC's default acceptance of VLA's though.