Продолжая работу с my previous question, я столкнулся с различным поведением clang и GCC.
Мне нужно проверить указатель функции-члена, потому что мне нужно знать, наследуется ли функция или нет.Clang vs. GCC: ошибка в необоснованных перерывах контекста SFINAE
При сравнении указателей функций-членов в контексте SFINAE существует функция-член Foo::foo()
, но ее тело содержит код (x.hello()
), который в конечном итоге не компилируется.
Следующий код компилируется с clang. GCC, однако, как представляется, оценивает тело функции Foo::foo()
и выходит с ошибкой ('struct Caller' has no member named 'hello'
), несмотря на то, что находится в неоцененном контексте SFINAE (или я надеюсь).
#include <iostream>
#include <type_traits>
struct Foo
{
template <typename T> void foo(T&& x) { x.hello(); }
};
struct Caller
{
template <typename T>
auto call(T&& x) -> decltype(
std::enable_if_t<
std::is_same<
decltype(&T::template foo<decltype(*this)>),
void (T::*)(decltype(*this))
>::value
>())
{
//x.foo(*this);
}
};
int main()
{
Caller c;
c.call(Foo());
}
я тестировал с:
- лязгом 3.8.0
- г ++ 6.1.0
опции компилятора для обоих: -std=c++14 -O2 -Wall -pedantic -pthread
Мои вопросы:
- , кто прав? Clang или GCC?
- Как я могу получить код для компиляции с GCC?
Как насчет упоминания версий и вариантов компиляторов? 'x.hello()' определенно не в контексте SFINAE. –