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