我有std::vector<std::string>。如果我这样做push_back({ '1', '2' }),那么一切都好。但是如果你把它变成emplace_back(std::move({ '1', '2' })),那么代码将无法编译,尽管从 push_back 的实现来看,它确实做了同样的事情。
_CONSTEXPR20 void push_back(_Ty&& _Val) {
// insert by moving into element at end, provide strong guarantee
emplace_back(_STD move(_Val));
}
我不明白哪些细微差别?以及使用 push_back 时,brace-init-list 如何到达向量中的字符串构造函数?毕竟大括号初始化列表不是一个对象,你怎么能在它上面做一个右值引用呢?
为了
std::move({'1', '2'})工作,编译器需要move从 type 中猜测模板参数(函数参数的类型){'1', '2'}。并且花括号没有类型1 - 所以这里有一个错误。但是
push_back(_Ty &&)参数的类型是预先知道的(从向量的模板参数中),所以当从花括号中调用时,会创建一个这种类型的临时对象。引用不是对它,而是对从它创建的临时对象。
1不,类型不是
std::initializer_list<char>。这在本例中更为明显: