Ошибка компиляции при попытке скомпилировать тело метода, используемого в проверках SFINAE - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть этот хорошо известный пример класса, который определяет, является ли тип классом или нет.

#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? Следует ли проверять метод на наличие ошибок компиляции или это не является обязательным и не обеспечивается стандартом?

1 Ответ

0 голосов
/ 04 ноября 2019

Скорее всего, вы строите с использованием разрешающего режима в VS, который отключает двухфазный поиск (который был недавно реализован). Отключение разрешающего режима путем указания аргумента /permissive- также приведет к сбою компиляции в VS .

...