使用typedef和SFINAE的IntelC ++ 15.0(在Linux上)的奇怪行为

时间:2015-05-11 18:52:51

标签: c++ linux typedef sfinae icc

最近我想从g ++转向IntelC ++编译器,希望获得更好的性能,但我得到了各种编译器错误。我深入挖掘并注意到了IntelC ++编译器的这种奇怪的行为。

#include <iostream>
using namespace std;

struct B {};

template<typename T>
struct A
{
  operator std::string() const
  {
    return "testing";
  }
};

typedef A<B> C;

template<typename T>
struct SupportsStringOperator
{
  typedef char Yes;
  typedef Yes No[2];

  template <typename U, U> struct has;

  template <typename Fun>
  static Yes& fun_test(has<std::string (Fun::*)() const, &Fun::operator std::string>*);

  template <typename Fun>
  static Yes& fun_test(has<std::string (Fun::*)(), &Fun::operator std::string>*);

  template<typename>
  static No& fun_test(...);

  static const bool value = (sizeof(fun_test<T>(0)) == sizeof(Yes));
};

int main()
{
  A<B> a;
  cout << std::is_same<C, A<B>>::value << endl;
  cout << SupportsStringOperator<C>::value << endl;
  cout << SupportsStringOperator<A<B>>::value << endl;
}

此代码的输出为:

1
0
0

仅当您将主要功能更改为 -

int main()
{
  A<B> a;
  cout << std::is_same<C, A<B>>::value << endl;
  cout << SupportsStringOperator<A<B>>::value << endl;
  cout << SupportsStringOperator<A<B>>::value << endl;
}

输出将是 -

1
1
1

这种行为背后是否有理性? g ++和clang ++为这两个代码生成第二个输出。

0 个答案:

没有答案