数据成员SFINAE的C++17测试:gcc vs clang
C++17 testing for data-member SFINAE: gcc vs clang
我有一个简单的代码片段,我试图在其中测试数据成员:
#include <type_traits>
template< typename T0 >
using is_data_member = std::bool_constant< std::is_same_v< std::void_t< T0 >, void > >;
template< typename U,
std::add_pointer_t< std::enable_if_t<
is_data_member< decltype( std::declval< U >().a ) >::value
> > = nullptr >
auto test() {}
struct A { int a; };
struct B {};
int main() {
static_assert( is_data_member< decltype( std::declval< A >().a ) >::value );
// #1: static_assert below fails in both gcc and clang.
// static_assert( is_data_member< decltype( std::declval< B >().a ) >::value );
test< A >();
// #2: test< B >() below fails in gcc, but does not fail in clang?
test< B >();
}
有了gcc
,一切都如我所料:#1
和#2
都出现编译错误。但对于clang
,只有#1
无法编译,而#2
可以编译。请自己看看:godbolt上的代码。
所以问题是,基本上,发生了什么?我倾向于认为,与gcc
相比,clang
对标准的遵守程度略高,但在这种情况下,我认为clang
错了?
谢谢!
这似乎是Clang中的一个错误。根据目前的Clang干线,替换失败,正如预期的那样。
我想这个错误报告解决了这个问题,根据这个错误报告,如果别名模板(如is_data_member
(的参数出现在非类型模板参数的类型说明符中,则在替换过程中没有正确处理它们。
相关文章:
- 数据成员SFINAE的C++17测试:gcc vs clang
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- 命名空间范围内的外部 - GCC vs clang vs msvc
- C++正则表达式失败(GCC vs Microsoft 编译器)
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- `noexcept`函数中的std :: terminate`调用函数有限-GCC vs clang codegen
- variadic模板代码中的GCC VS MSVC编译误差
- GCC vs CLANG:除了静态强制转换时在未使用的模板专用化中解析外,否
- GCC vs CLANG:将捕获的参数包扩展两次
- GCC vs Clang 中的堆栈粉碎(可能是由于金丝雀)
- "Nested" 带括号的类模板参数推导:GCC vs. clang
- C 构造函数:使用this_class(GCC vs Visualc)
- GCC vs Clang:将功能与-FPIC一起插入
- Glibc vs GCC vs binutils compatibility
- 模板编译:gcc vs VS2010
- GCC vs. Clang:"invalid use of incomplete type" std::d eclval 和模板专业化
- 默认参数,gcc vs clang
- Clang vs GCC vs MSVC模板转换操作符-哪个编译器是正确的
- GCC vs clang -使用' make_overload '可变lambda继承时的模糊重载
- Clang vs. GCC vs. MSVC中的SFINAE和可见性检查——这是正确的