扣除指南是否需要 noexcept 说明符?

Do deduction guides require noexcept specifiers?

提问人:skypjack 提问时间:4/9/2021 最后编辑:skypjack 更新时间:4/9/2021 访问量:121

问:

出于某些原因,我一直认为演绎指南必须与它们所引用的构造函数具有相同的 -ness。例如:noexcept

template<typename T>
struct clazz {
    clazz(const T &) noexcept {}
};

clazz(const char &) noexcept -> clazz<int>;

也就是说,如果构造函数是并且我希望它也是 ,我还必须将说明符添加到演绎指南中。noexceptconst char &noexcept

今天我与ICC合作了一下,发现它在扣除指南方面存在问题。目前为止,一切都好。我以为这是编译器的错误,仅此而已。
然而,我去研究标准,找不到任何一点可以证实我最初的假设。正因为如此,我针对 clang 进行了相同的检查,即使它没有问题,似乎在 100% 的情况下,扣除指南被忽略了。另一方面,构造函数上的那个会影响两者。
noexceptnoexcept

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

C++ 模板 C++17 语言-律师 演绎-指南

评论

0赞 Jarod42 4/9/2021
cppreference,语法是 ;不。。。explicit-specifier(optional) template-name ( parameter-declaration-clause ) -> simple-template-id ;noexcept

答:

7赞 NathanOliver 4/9/2021 #1

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

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

正如你所看到的,它不包含异常说明符。

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

评论

0赞 Jarod42 4/9/2021
所以 clang/gcc/msvc 在这里都是不正确的:-/
0赞 skypjack 4/9/2021
那么,粗略地说,所有主要的编译器都错了?因为它确实被忽略了,但即使标准明确规定令牌不应该存在,他们也会接受它。
0赞 NathanOliver 4/9/2021
@Jarod42我相信他们是。他们允许它是有道理的,因为这是一件容易被忽视的事情,并且与发生的事情没有实际关系。
2赞 NathanOliver 4/9/2021
@skypjack 是的。不过,这比 GCC 默认接受 VLA 要少得多。
1赞 NathanOliver 4/9/2021
@skypjack 不客气。如果你有一个小时,你应该看一下这个演讲。它涉及很多更精细的细节,并且确实很好地解释了整个事情。恕我直言,Stephan T. Lavavej 做得很好。