Проблема с поиском имени, GCC и clang расходятся во мнениях

Как указал ecatmur, на этот вопрос уже есть ответ здесь< /а>.

Этот вопрос очевидно не дублирует конечный возвращаемый тип с использованием decltype с функцией шаблона с переменным числом аргументов. На самом деле он пытается предложить более простое решение для решения проблемы в этой ветке. Вопрос в том, является ли это решение правильным по стандарту, потому что GCC и clang не согласны с ним. Просто прочитайте вопрос немного внимательнее, и вы это поймете.

Этот вопрос навеян этим. Я пытаюсь придумать более простое решение, чем те, которые уже были предоставлены, и в итоге получаю следующее:

#include <iostream>

struct S {
    template <typename T>
    static T sum(T t){
        return t;
    }

    template <typename T, typename ...U>
    static auto sum(T t, U... u) -> decltype(t + sum(u...)) {
        return t + sum(u...);
    }
};

int main() {
    std::cout << S::sum(1, 1.5, 2) << '\n';
}

Хотя это решение работает с GCC, оно вообще не решает проблему с clang. Так вот, мне интересно, какой из них правильный.


person Lingxi    schedule 08.05.2015    source источник
comment
не удается скомпилировать для меня на clang: main.cpp:10:17: примечание: шаблон-кандидат игнорируется: ошибка замены [с T = int, U = ‹double, int›]: нет соответствующей функции для вызова 'sum' static auto sum(T t, U... u) -> decltype(t + sum(u...)) { ^ ~~~ main.cpp:5:17: примечание: шаблон функции-кандидата нежизнеспособен: требуется один аргумент ' t', но были предоставлены 3 аргумента static auto sum(T t){   -  person Richard Hodges    schedule 08.05.2015
comment
@ecatmur Это не дубликат. Просто прочитайте мой вопрос немного внимательнее, и вы это поймете.   -  person Lingxi    schedule 08.05.2015
comment
@ecatmur Ты прав. Закрою этот вопрос.   -  person Lingxi    schedule 08.05.2015
comment
@ecatmur Поскольку на вопрос уже есть ответ. Удаление кажется нецелесообразным. Но я отредактировал вопрос, чтобы упомянуть другую тему.   -  person Lingxi    schedule 08.05.2015


Ответы (1)


Лучшее обходное решение, которое я придумал, это:

#include <iostream>

struct S {
    template <typename T>
    static T sum(T t){
        return t;
    }

    template <typename S, typename T>
    static auto sum(S s, T t) -> decltype(s + t) {
        return s + t;
    }

    template <typename S, typename T, typename ...U>
    static auto sum(S s, T t, U... u) -> decltype(s + t) {
        return s + sum(t, u...);
    }
};

int main() {
    std::cout << S::sum(1, 1.5, 2) << '\n';
}

У clang, похоже, есть проблема с разрешением рекурсивной функции/метода в директиве decltype...

person W.F.    schedule 08.05.2015
comment
decltype(s + t) может отличаться от decltype(s + x), где x = t + u.... - person Lingxi; 08.05.2015
comment
похоже, вы правы - я видел, что это работает на вашем простом примере ... позвольте мне тогда переосмыслить свой ответ ... - person W.F.; 08.05.2015