【发布时间】:2021-06-07 13:21:08
【问题描述】:
我正在使用 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 的原因可能会出现问题并且需要很长时间。
【问题讨论】:
-
一种方法可能是注释掉除一个之外的所有重载。这样,您应该会收到更丰富的错误消息。
-
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]。