加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 数组衰减到指针和重载决策

发布时间:2020-12-16 06:52:46 所属栏目:百科 来源:网络整理
导读:我希望能够在重载分辨率中区分数组和指针: class string {public: string(const char* c_str); templateint N string(const char (str) [N]);};int main() { const char* c_str = "foo"; string foo(c_str); // ok will call string(const char*) string ba
我希望能够在重载分辨率中区分数组和指针:

class string {
public:
        string(const char* c_str);

        template<int N>
        string(const char (&str) [N]);
};


int main() {
        const char* c_str = "foo";
        string foo(c_str);      // ok will call string(const char*)

        string bar("bar");      // call string(const char*) instead of the array version
}

到目前为止我发现的最好的是使用指针的引用而不是指针:

class string {
public:
        string(const char*& c_str);

        template<int N>
        string(const char (&str) [N]);
};


int main() {
        const char* c_str = "foo";
        string foo(c_str);      // ok will call string(const char*)
        string bar("bar");      // ok,will call the array version
}

它不是完全相同的东西,我想知道是否存在更好的方法

解决方法

当两者都可行时,你需要使第一个过载成为较差的选择.目前它们与转换排名相关(两者都是“完全匹配”),然后由于非模板是首选,因此打破了平局.

这应该使转换排名更差:

struct stg
{
    struct cvt { const char* p; cvt(const char* p_p) : p(p_p) {} };

    // matches const char*,but disfavored in overload ranking
    stg(cvt c_str); // use c_str.p inside :(  Or add an implicit conversion

    template<int N>
    stg(const char (&str) [N]);
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读