演绎指南是否需要 noexcept 说明符?
Do deduction guides require noexcept specifiers?
出于某些原因,我一直认为演绎指南必须具有与它们所引用的构造函数相同的 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 ;
如您所见,它不包含异常说明符。
这确实有道理。演绎指南实际上并没有构造任何东西。它只是用来告诉编译器如何从一组参数中获取模板参数。您有一个两步过程,推导指南 运行 通过重载决议来确定模板参数,然后使用那些推导的模板参数枚举构造函数,并且重载决议是 运行 针对构造函数。
出于某些原因,我一直认为演绎指南必须具有与它们所引用的构造函数相同的 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 ;
如您所见,它不包含异常说明符。
这确实有道理。演绎指南实际上并没有构造任何东西。它只是用来告诉编译器如何从一组参数中获取模板参数。您有一个两步过程,推导指南 运行 通过重载决议来确定模板参数,然后使用那些推导的模板参数枚举构造函数,并且重载决议是 运行 针对构造函数。