名称查找问题,GCC和clang不同意

Lin*_*gxi 8 c++ language-lawyer name-lookup c++11 trailing-return-type

正如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';
}
Run Code Online (Sandbox Code Playgroud)

虽然这个解决方案适用于GCC,但它根本没有解决问题.所以,我想知道哪一个是正确的.

W.F*_*.F. 0

我想出的最佳解决方法是:

#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';
}
Run Code Online (Sandbox Code Playgroud)

clang 似乎在解决 decltype 指令中的递归函数/方法时存在问题......