繁体   English   中英

为什么 std::string 没有 emplace 或 emplace_back?

[英]Why is there no emplace or emplace_back for std::string?

我很确定我以前在这里看到过这个问题,但是当我尝试搜索时似乎找不到该帖子,而且我不记得答案了。

为什么没有emplaceemplace_backstd::string

我认为这与char的使用无关,因为您可以拥有一个字符向量,并且在向量中使用emplace_back一个字符没有问题。

push_back不会有任何好处

emplace_back的强大之emplace_back在于它就地构造了一个对象,它被设计为停留在那里。 不需要复制或移动。 它还为创建对象提供了更简单的语法,但这只是一个小优势。

class Person
{
    std::string name;
    int age;
    double salary;
}

int main()
{
    std::vector<Person> people;
    people.push_back(Person{"Smith", 42, 10000.0}); //temporary object is needed, which is moved to storage
    people.emplace_back("Smith", 42, 10000.0); //no temporary object and concise syntax
}

对于std::string (或任何只能容纳原始类型的理论容器),增益是不存在的。 无论您是在原地构造对象还是移动或复制它,您都在程序集级别执行相同的操作 - 在给定内存中写入一些字节。
语法也不能变得比现在更简洁——没有需要调用的构造函数。 您可以使用文字或其他变量,但您必须在push_backemplace_back做完全相同的事情

int main()
{
    std::vector<char> letters;
    letters.push_back('a');
    letters.emplace_back('a'); //no difference
}

(eg) std::vector‹T>::emplace_back是它直接在向量中构造了一个 T 类型的对象,而不是构造一个临时对象然后再复制进去。

由于char是一种原始类型,因此一种方法与另一种方法相比没有优势,因此std::string::emplace_back没有理由存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM