请参阅某个函数的SFINAE原因



我正在使用CLang。某个函数或整个.cpp是否有方法将SFINAE视为错误?某个函数是否有选项--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->template casttc<u64>(),它给出了编译错误:

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 {

所以基本上它说,由于某种原因,这个函数的<u64>专业化不能使用。我也不知道是什么导致了这个问题。

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

所以我担心CLang没有给我错误的确切原因,它只是说<u64>专业化在没有额外原因的情况下是不可用的。据我所知,由于SFINAE,该专业化被删除(或无法使用(。因此,对于类似的情况,我希望能够在编译器不使用SFINAE的情况下看到失败的确切原因。

在我的情况下,函数不是很大,我可以手动查找错误。但如果一个函数的主体是巨大的(我以前也遇到过这样的情况(,那么找到SFINAE的原因可能会有问题,并且需要很多时间。

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

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,而是因为我没有注意到我的构建系统截断了错误。

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

相关内容

最新更新