首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++命名空间规范是多余的还是有用的?

C++命名空间规范是多余的还是有用的?
EN

Stack Overflow用户
提问于 2013-06-15 06:40:15
回答 1查看 275关注 0票数 1

据我所知,函数解析是从内部作用域到外部作用域。因此,在下面的示例中,MyNamespace::foo()将在这两种情况下执行。

代码语言:javascript
复制
foo() {}
namespace MyNamespace
{
    void foo() {}
    void bar() {foo()}
}

foo() {}
namespace MyNamespace
{
    void foo() {}
    void bar() {MyNamespace::foo()} // redundant, or safe and expressive?
}

但是,可能会出现这样的情况:您打算调用MyNamespace::foo(),但由于实际上并未定义您的MyNamespace::foo(),因此将调用已定义的全局foo()

代码语言:javascript
复制
foo() {printf("I don't think you meant to call me...");}
namespace MyNamespace
{
    //foo() {}
    void bar() {foo()}
}

因此,显式声明名称空间是安全且良好的做法,还是这种情况还不够频繁,不足以证明额外的冗长是合理的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-15 07:30:32

对于函数,我建议在一般情况下避免名称空间限定,除非需要防止实际的或潜在的歧义。这在泛型(模板)代码中特别有价值,因为命名空间限定抑制了依赖于参数的查找。允许与实际类一起提供的函数可以产生更好的代码,有时还可以避免破坏。例如:

代码语言:javascript
复制
namespace foo {
    template<typename T>
    struct Ctnr {
        Ctnr();
        Ctnr( Ctnr const & );
        Ctnr &operator=( Ctnr const & );
        ~Ctnr();
        // ...
        friend void swap( Ctnr<T> &, Ctnr<T> & ); // Does not throw.
    };
}
namespace bar {
    template<typename T>
    void exchange( T &lhs, T &rhs ) {
        std::swap( lhs, rhs );
    }

    static foo::Ctnr<string> state;
    void set_state( foo::Ctnr<string> new_state ) {
        // Calls std::swap, which may throw and corrupt state:
        exchange( state, new_state );
    }
}

如果bar::exchange<T>()是用ADL编写的,bar::set_state()就会使用foo的非抛出swap(),最好把exchange()写成using std::swap; swap( lhs, rhs);

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

https://stackoverflow.com/questions/17118304

复制
相关文章

相似问题

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