[C ++ 17测试数据成员SFINAE:gcc与clang

问题描述 投票:1回答:1

我有一个简单的代码片段,正在尝试测试数据成员:

#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确实可以编译。请自己看看:code on godbolt

所以,问题基本上是怎么回事?与clang相比,我倾向于认为gcc与标准的兼容性更好,但在这种情况下,我认为clang是错误的?

谢谢!

c++ gcc clang c++17 sfinae
1个回答
0
投票

这似乎是Clang中的错误。使用当前的Clang干线,替换将按预期失败。

© www.soinside.com 2019 - 2024. All rights reserved.