【发布时间】:2019-07-13 14:05:14
【问题描述】:
考虑这段代码:
constexpr int XX = 10;
template < auto& II > struct Ban { };
template < auto& II >
std:: true_type test(Ban<II>*);
std::false_type test(...);
和:
using BB = decltype(test(std::declval<Ban<XX>*>()));
在这里,我希望 BB 是 std::true_type,但对于 gcc-8.3 和 clang-8.0,它是 std::false_type。这是这些编译器的错误吗?
请注意,当我将 auto& 更改为 auto 时,BB 变为 std::true_type。另请注意,如果我使用int const 而不是auto,gcc 的情况是相同的,所以int const& 屈服于std::false_type,而int const 屈服于std::true_type,而对于clang @987654341 @ 屈服于 std::true_type。您可以找到实时示例here。
是否有一种解决方法可以使用非类型引用的模板来执行这种 SFINAE?关键是要有像IsInstantiationOfBan 这样的实用程序。
【问题讨论】:
-
我在标准中看不到任何明确说明模板参数推导如何适用于包含占位符类型的非类型模板参数的内容。
标签: gcc clang c++17 sfinae non-type