是否有任何使用emplace_back替换push_back不正确的情况?

Vio*_*ffe 9 c++ vector c++11 c++03

中途我可以通过更换一个有效的C++程序03 std::vector::push_backemplace_back与C++编译器11编译呢?从阅读emplace_back参考我收集它不应该发生,但我承认我没有完全得到右值参考.

Bri*_*ian 16

我构造了一个简短的例子,当push_back被替换为emplace_back以下时实际上无法编译:

#include <vector>
struct S {
    S(double) {}
  private:
    explicit S(int) {}
};
int main() {
    std::vector<S>().push_back(0); // OK
    std::vector<S>().emplace_back(0); // error!
}
Run Code Online (Sandbox Code Playgroud)

调用push_back需要将其参数0从type 转换int为type S.由于这是隐式转换,因此S::S(int)不会考虑显式构造函数,并且S::S(double)会调用它.在另一方面,emplace_back进行直接初始化,这样既S::S(double)S::S(int)被考虑.后者是一个更好的匹配,但它是private,所以该程序是不正确的.

  • 确实,聪明.当我第一次看到这个问题时,我心想,"好吧,`emplace_back`可以调用显式构造函数".然后我愚蠢地想,"但是当从'emplace_back`转到`push_back`时,这是一个突破性的变化,而不是相反".你可以做同样的事情,`emplace_back`调用变得模糊,其中`push_back`不是:`struct S {S(double){} explicit S(float){}};`,但当然那是一个*可怕的*一组构造函数给`S`. (2认同)