【问题标题】:Do deduction guides require noexcept specifiers?演绎指南是否需要 noexcept 说明符?
【发布时间】:2021-07-05 11:27:37
【问题描述】:

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

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

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

也就是说,如果构造函数是 noexcept 并且我希望 const char &amp; 也是如此,我还必须将 noexcept 说明符添加到推导指南中。

今天我在 ICC 工作了一点,发现它在演绎指南上的 noexcept 有问题。到目前为止,一切都很好。我认为这是编译器的错误,仅此而已。
但是,我查看了标准,找不到任何可以证实我最初假设的点。因此,我对 clang 进行了同样的检查,即使它没有问题,但似乎在 100% 的情况下,演绎指南上的 noexcept 都会被忽略。另一方面,构造函数上的那个会影响两者。

所以,我的问题是,它是否有意义或者是否需要在某种程度上传播(如果这有意义的话)构造函数的noexcept-ness 也适用于演绎指南还是没用,我可以把推导指南上的所有noexcept去掉?

【问题讨论】:

  • 来自cppreference,语法为explicit-specifier(optional) template-name ( parameter-declaration-clause ) -&gt; simple-template-id ;;没有noexcept...

标签: c++ templates c++17 language-lawyer deduction-guide


【解决方案1】:

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

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

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

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

【讨论】:

  • 所以 clang/gcc/msvc 都不正确here :-/
  • 那么,粗略的说,各大编译器都错了?因为它确实会被忽略,但即使标准明确表示令牌不应该存在,他们也会接受它。
  • @Jarod42 我相信他们是。他们允许这样做是有道理的,因为它很容易被忽略,并且对发生的事情没有实际影响。
  • @skypjack 是的。与 GCC 对 VLA 的默认接受相比,这要少得多。
  • @skypjack 不客气。如果你有一个小时,你应该给this talk一块手表。它涉及到许多更精细的细节,并且确实很好地解释了整个事情。恕我直言,Stephan T. Lavavej 做得很好。
猜你喜欢
  • 2019-09-11
  • 2017-06-30
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2016-02-13
  • 1970-01-01
  • 2019-09-23
相关资源
最近更新 更多