微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ADL 不在外面工作即使是结构

如何解决ADL 不在外面工作即使是结构

如果我有一个结构重载 beginend 等,如下所示:

#include <array>

template<typename T>
struct Array10
{
private:
    std::array<T,10> m_array;
public:
    constexpr auto begin()
    {
        return std::begin(m_array); // #1
    }

    constexpr auto end()
    {
        return std::end(m_array);
    }

    // cbegin,cend,rbegin,rend,crbegin,crend
};

int main()
{
    Array10<int> arr;
    std::fill(
    std::begin(arr),// #2
    std::end(arr),0);
}

然后我明白为什么我必须在 #1 中使用 std::begin 而不是 begin(因为这是最接近的范围 begin 被定义),但我不明白为什么我必须在#2 中使用它。 我的第一个猜测是因为 Array10main 在同一个命名空间中,但将其放入自己的命名空间并不能解决问题。

那么:为什么 ADL 在 std::begin(#2) 中找不到 main

解决方法

ADL 找不到成员。它会找到免费功能。

您有一个成员 foo.begin(),而不是一个免费函数 begin(foo)

friend constexpr auto begin(Array10&)
{
    return std::begin(m_array); // #1
}
friend constexpr auto begin(Array10 const&)
{
    return std::begin(m_array); // #1
}

那些是将通过 ADL 找到的非成员 begin 函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。