提问人:skypjack 提问时间:4/9/2021 最后编辑:skypjack 更新时间:4/9/2021 访问量:121
扣除指南是否需要 noexcept 说明符?
Do deduction guides require noexcept specifiers?
问:
出于某些原因,我一直认为演绎指南必须与它们所引用的构造函数具有相同的 -ness。例如:noexcept
template<typename T>
struct clazz {
clazz(const T &) noexcept {}
};
clazz(const char &) noexcept -> clazz<int>;
也就是说,如果构造函数是并且我希望它也是 ,我还必须将说明符添加到演绎指南中。noexcept
const char &
noexcept
今天我与ICC合作了一下,发现它在扣除指南方面存在问题。目前为止,一切都好。我以为这是编译器的错误,仅此而已。
然而,我去研究标准,找不到任何一点可以证实我最初的假设。正因为如此,我针对 clang 进行了相同的检查,即使它没有问题,似乎在 100% 的情况下,扣除指南被忽略了。另一方面,构造函数上的那个会影响两者。noexcept
noexcept
所以,我的问题是,它是否有任何意义,或者是否需要在某种程度上传播(如果这有意义的话)构造函数的 -ness 也到演绎指南中,或者它是否无用,我可以摆脱所有演绎指南?noexcept
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 做得很好。
上一个:大括号初始值设定项列表的扣除指南
下一个:无法推断模板参数 [重复]
评论
explicit-specifier(optional) template-name ( parameter-declaration-clause ) -> simple-template-id ;
noexcept