You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

局部定义友元函数:后置返回类型与requires子句访问成员的Clang编译疑问

模板类友元函数的类型访问问题

这段代码中的所有友元函数均可通过GCC和Visual Studio编译,但Clang在处理带后置返回类型的bar_trailing_return函数时会报错,错误提示为成员访问到不完全类型 'const S'——具体是在后置返回类型中访问S<T>::foo()时编译失败。

疑问点:如果Clang的行为是正确的,为何后置返回类型中不允许访问不完全类型,而requires子句中却允许?

#include <concepts>

template<typename T>
struct S {
    T m_t;

    T const& foo() const& { return m_t; }

    friend auto bar_auto(S const& s) {
        return s.foo();
    }

    friend decltype(auto) bar_decltype_auto(S const& s) {
        return s.foo();
    }

    friend decltype(auto) bar_requires(S const& s) requires std::same_as<T const&, decltype(s.foo())> {
        return s.foo();
    }

    friend auto bar_trailing_return(S const& s) -> decltype(s.foo()) { // clang error: member access into incomplete type 'const S<int>'
        return s.foo();
    }
};

S<int> s{1};

经确认,此问题是Clang的Bug。

内容的提问来源于stack exchange,提问作者wanghan02

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:35:29