最近我想从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 ++为这两个代码生成第二个输出。