首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么range-v3将其函数对象放入内联命名空间?

为什么range-v3将其函数对象放入内联命名空间?
EN

Stack Overflow用户
提问于 2018-04-24 20:13:19
回答 1查看 458关注 0票数 13

在range-v3中,所有函数实际上都是内联命名空间中的全局函数对象。

#如果RANGES_CXX_INLINE_VARIABLES < RANGES_CXX_INLINE_VARIABLES_17 #定义RANGES_INLINE_VARIABLE(类型,名称)\内联名称空间function_objects \{内联名称空间\{auto &name = ::ranges::static_const::value;\} #define // RANGES_CXX_INLINE_VARIABLES >= RANGES_CXX_INLINE_VARIABLES_17 #定义RANGES_INLINE_VARIABLE(类型,名称)\内联命名空间function_objects \\ inline类型名称{};#endif // RANGES_CXX_INLINE_VARIABLES

function_objects命名空间的用途是什么?据我所知,在图书馆的其他任何地方都没有引用它。

EN

回答 1

Stack Overflow用户

发布于 2018-04-24 21:51:50

根据凯西对按下的评论(谢谢贾斯汀),inline namespace对于这样的工作是必要的:

代码语言:javascript
运行
复制
namespace N {
    namespace detail {
        // default implementation
        template <typename T> void swap(T&, T& ) { ... }

        struct swap_fn {
            template <typename T>
            void operator()(T& a, T& b) {
                swap(a, b); // unqualified call, the default is in scope
            }
        };
    }

    // the object
    inline namespace CPO { inline constexpr detail::swap_fn swap{}; } // #1

    struct S { friend void swap(S&, S&) { ... } }; // #2
}

N::S a;
N::swap(a, a); // calls the CPO, which calls the friend function

如果定制点对象swap (at #1)不在其自己的命名空间中,则cpo与为S (at #2)类型声明的非会员friend之间将出现名称冲突。它们必须位于不同的命名空间中。

将CPO放入内联命名空间就足够了,因为常规的不合格或限定的查找永远不会在#2找到这个交换空间--它只会由ADL找到,而这种情况只发生在swap_fn::operator()中。

是啊,这挺酷的。也很复杂。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50010074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档