V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huzhikuizainali
V2EX  ›  C++

请问究竟什么是 C++中的“相容类型”的含义?

  •  
  •   huzhikuizainali · 310 天前 · 1033 次点击
    这是一个创建于 310 天前的主题,其中的信息可能已经有所发展或是发生改变。

    《 C++ Primer 》 P302

    赋值运算符要求左边和右边的运算对象具有相同的类型。它将右边运算对象中所有元素拷贝到左边运算对象中。顺序容器(arra y 除外)还定义了一个名为 assign 的成员,允许我们从一个不同但相容的类型赋值,或者从容器的一个子序列赋值。assign 操作用参数所指定的元素(的拷贝)替换左边容器中的所有元素。例如,我们可以用 assgin 实现将一个 vector 中的一段 char *值赋予一个 list 中的 string :

    list<string>names;

    vector<const char*>oldstyle;

    names=oldstyle;//错误:容器类型不匹配

    //正确:可以将 const char *转换为 string

    names.assign(oldstyle.cbegin(),oldstyle.cend());


    我在网上找到了两个相关说明。不知道哪一个才是上文“相容的类型”的准确描述?

    csdn 的描述比较清晰简单: https://blog.csdn.net/qq_66726657/article/details/131076899

    cppreference.com 的介绍比较复杂抽象,其中还包含许多陌生概念: https://zh.cppreference.com/w/c/language/types#.E5.85.BC.E5.AE.B9.E7.B1.BB.E5.9E.8B

    jones2000
        1
    jones2000  
       310 天前
    string 和 char* 本质都一样的, 就相当于把 char*里面的内容拷贝到 string 里面。
    sanbuks
        2
    sanbuks  
       309 天前
    参考《 C++标准库》 p407, 你可以理解为 可由目标对象构造的类型;
    底层应该是在未初始化的内存上调用 std::allocator<T>::construct 通过参数构造对象.
    ps: 第九章可以直接跳过, 后面不会的可以作为手册参考, 这章精读我觉得意义不大...
    huzhikuizainali
        3
    huzhikuizainali  
    OP
       309 天前
    @sanbuks 谢谢回复。请问你说的是第几版 P407 ?可否提供一下 ISBN 号
    sanbuks
        4
    sanbuks  
       308 天前
    C++标准库 第二版 中文版
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3117 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:09 · PVG 22:09 · LAX 06:09 · JFK 09:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.