【问题标题】:See SFINAE reason for a certain function请参阅某个功能的 SFINAE 原因
【发布时间】:2021-06-07 13:21:08
【问题描述】:

我正在使用 CLang。有没有办法让某个函数或整个.cppSFINAE 视为错误?如果某个功能有--sfinae-as-error#pragma sfinae_disable/#pragma sfinae_enable选项?

似乎由于SFINAE我的功能专业化已经消失(变得无法使用)并且我不知道如何找到它失败的原因(SFINAE来自哪里),基本上我有无意的SFINAE案例,我想找出导致它的行。

为了解释这一点,我有一个小方法:

template <typename To>
auto casttc() const {
    if constexpr(std::is_same_v<To, T>)
        return *this;
    Vec<RTBits, Bits, To> c;
    auto constexpr castt_ = castt_reg_helper<RTGet<To>, RT>::f;
    LOOPM({ GI; c.template reg<I>() = castt_(this->template reg<I>()); });
    return c;
}

从另一种方法我称之为this-&gt;template casttc&lt;u64&gt;(),它给出了编译错误:

drafts/intrin_simd3.hpp:199:10: note: candidate template ignored: substitution failure [with To = unsigned long long]
    auto casttc() const {

上述错误消息中的第 199 行指向auto casttc() const {

有几个错误日志屏幕,这些行是此日志的最后几行:

In file included from drafts/cordic.cpp:12:
In file included from drafts/intrin_simd3.hpp:157:
drafts/intrin_simd2.hpp:140:61: error: no matching member function for call to 'casttc'
        *this = this->template casttc<T0>().and_(b.template casttc<T0>()).template casttc<T>();
                                                 ~~~~~~~~~~~^~~~~~~~~~
drafts/intrin_simd3.hpp:199:10: note: candidate template ignored: substitution failure [with To = unsigned long long]
    auto casttc() const {

所以基本上它说由于某种原因&lt;u64&gt; 这个函数的特化不能被使用。而且我事先不知道是什么导致了这个问题。

一段时间后,我设法找出了问题所在,即castt_reg_helper&lt;RTGet&lt;To&gt;, RT&gt; 对给定的模板参数没有专门化。在我添加了必要的专业化之后,一切都开始编译了。

所以我担心 CLang 没有给我准确的错误原因,它只是说 &lt;u64&gt; 专业化在没有额外原因的情况下无法使用。据我了解,由于 SFINAE,此专业化已被删除(或变得无法使用)。因此,对于类似的情况,我希望能够在没有编译器静默使用 SFINAE 的情况下查看失败的确切原因。

在我的情况下,功能不是很大,我可以手动找到错误。但是如果函数体很大(我之前也遇到过这种情况),那么寻找 SFINAE 的原因可能会出现问题并且需要很长时间。

【问题讨论】:

  • 一种方法可能是注释掉除一个之外的所有重载。这样,您应该会收到更丰富的错误消息。
  • SFINAE 取决于签名,而不是函数体...
  • @PaulSanders 我没有重载,我只有我展示的这个函数。
  • @Jarod42 请参阅我的函数文本。当我为必要的类型实现castt_reg_helper 专业化时,错误就消失了。这意味着出于某种原因,可能不是 SFINAE,但 CLang 并没有说错误是由于 castt_reg_helper 没有专门针对给定类型。
  • @Jarod42 基本上 CLang 根本没有提到 casttc() 的正文。它只是说函数的标题note: candidate template ignored: substitution failure [with To = unsigned long long]

标签: c++ clang sfinae


【解决方案1】:

基本上我的构建系统只是输出了最后一个错误屏幕,它将错误截断到控制台上显示的最后一个屏幕。当然,在屏幕开头它显示了截断发生的微小消息,但我没有注意到。当我恢复整个日志时,出现了以下几行:

In file included from drafts/cordic.cpp:12:
drafts/intrin_simd3.hpp:203:33: error: implicit instantiation of undefined template 'asimd::Vec<256, 512, double>::castt_reg_helper<__attribute__((__vector_size__(4 * sizeof(long long)))) long long, __attribute__((__vector_size__(4 * sizeof(double)))) double>'
        auto constexpr castt_ = castt_reg_helper<RTGet<To>, RT>::f;
                                ^

这解决了我的问题。显然,这似乎不是 SFINAE 的原因,而 CLang 实际上显示了详细的原因,但在错误日志中远高于此。

所以我的问题是一个错误,不是由于错误的 CLang,而是因为我没有注意到我的构建系统截断了错误。

我们有一个专门为我们的组织和我们的需求编写的特殊构建系统。它不是任何知名的开源构建系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多