7

由于某些原因,我一直认为演绎指南必须与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% 的情况下,扣除指南上的内容都会被忽略。另一方面,构造函数上的那个会影响两者。

所以,我的问题是,它是否有任何意义或者是否需要在某种程度上传播(如果这有道理的话)构造函数的-ness 也适用于演绎指南,或者它是无用的noexcept,我可以摆脱所有noexcept扣除指南?

4

1 回答 1

7

演绎指南的语法在[temp.deduct.guide]/1中定义为

explicit-specifier(opt) template-name ( parameter-declaration-clause ) -> simple-template-id ;

如您所见,它不包含异常说明符。

这确实有道理。演绎指南实际上并没有构建任何东西。它只是用来告诉编译器如何从一组参数中获取模板参数。您有一个两步过程,推导指南通过重载解析来确定模板参数,然后使用推导出的模板参数枚举构造函数,并针对构造函数运行重载解析。

于 2021-04-09T15:13:31.680 回答