为什么这个VC ++解决方法在GCC或clang中不起作用?

时间:2015-10-26 16:53:31

标签: c++ templates c++11

我遇到了this关于如何在C ++中实现编译时计数器的问题。

作者提供了this interesting article。我稍微修改了它并编译了它a workaround for Visual C++,当用Visual C ++编译时它确实有效。

#include <iostream>

template<int N>
struct flag {
  friend constexpr int adl_flag (flag<N>);
};

template<int N>
struct writer {
  friend constexpr int adl_flag (flag<N>) {
    return N;
  }

  static constexpr int value = N;
};

template<int N, class = char[noexcept(adl_flag(flag<N> ()))?+1:-1]>
int constexpr reader (int, flag<N>) {
  return N;
}

template<int N>
int constexpr reader (float, flag<N>, int R = reader (0, flag<N-1> ())) {
  return R;
}

int constexpr reader (float, flag<0>) {
  return 0;
}

template<int N = 1, int C = reader (0, flag<32> ())>
int constexpr next (int R = writer<C + N>::value) {
  return R;
}


int main () {
  constexpr int a = next();
  constexpr int b = next();
  constexpr int c = next();

  std::cout << a << " " << b  << " " << c << std::endl;
  static_assert (a == 1 && b == a+1 && c == b+1, "try again");
}
用VC ++输出

1 2 3

但是,该代码中的断言对onlineGCC都失败了。在评论断言时,clang

1 1 1

这种解决方法是利用VC ++中的错误还是应该在GCC / clang中工作?

0 个答案:

没有答案