У меня есть этот хорошо известный пример класса, который определяет, является ли тип классом или нет.
#include <cstdio>
#include <type_traits>
template <typename T>
class ClassDetector {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template <typename C> static One test(int C::*) {
compilation error;
}
template <typename C> static Two test(...);
public:
enum { Yes = sizeof(ClassDetector<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};
int main() {
printf("%d\n", ClassDetector<int>::Yes);
return 0;
}
Код не компилируется на GCC
и Clang
, потому что«Ошибка компиляции» нигде не определена, и компилятор не знает, что это такое. Но это работает под Visual Studio
. Это говорит о том, что Visual Studio полностью пропускает тело первого test
метода и даже ничего не проверяет внутри.
Итак, вопрос в том, кто прав в этом случае? GCC / Clang или VS? Следует ли проверять метод на наличие ошибок компиляции или это не является обязательным и не обеспечивается стандартом?