看起来像是这段代码:
#include <string>
#include <vector>
struct bla
{
std::string a;
int b;
};
int main()
{
std::vector<bla> v;
v.emplace_back("string", 42);
}
在这种情况下可能可以使其正常工作,但它没有(我理解原因)。给bla
一个构造函数可以解决这个问题,但会移除类型的聚合性,这可能会产生深远的影响。这在标准中是一个疏忽吗?还是我没有考虑到某些情况,这可能会让我掉进坑里,或者它并不像我想象的那么有用?
emplace_back
(以及所有类似的转发工厂函数,如std::make_unique
)始终使用括号来构造对象。为什么会这样,我不知道。 - Quentinv.push_back(bla { "string", 42 });
可用于从C++11到C++17的C++标准。从C++20开始,v.emplace_back("string", 42);
就能正常工作了。 - Kai Petzke