Namespaces
Variants

std::stack<T,Container>:: emplace

From cppreference.net

template < class ... Args >
void emplace ( Args && ... args ) ;
(自 C++11 起)
(直至 C++17 前)
template < class ... Args >
decltype ( auto ) emplace ( Args && ... args ) ;
(自 C++17 起)

在栈顶压入一个新元素。该元素是原地构造的,即不执行任何复制或移动操作。元素的构造函数将以与函数提供的参数完全相同的参数被调用。

等效地调用 c. emplace_back ( std:: forward < Args > ( args ) ... ) ;

目录

参数

args - 要转发给元素构造函数的参数

返回值

(无)

(C++17 前)

上述对 Container :: emplace_back 的调用所返回的值或引用(如果有)。

(C++17 起)

复杂度

Container :: emplace_back 的复杂度完全相同。

示例

#include <iostream>
#include <stack>
struct S
{
    int id;
    S(int i, double d, std::string s) : id{i}
    {
        std::cout << "S::S(" << i << ", " << d << ", \"" << s << "\");\n";
    }
};
int main()
{
    std::stack<S> stack;
    const S& s = stack.emplace(42, 3.14, "C++"); // 需要C++17以获取返回值
    std::cout << "id = " << s.id << '\n';
}

输出:

S::S(42, 3.14, "C++")
id = 42

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

DR 适用范围 发布时的行为 正确行为
LWG 2783 C++17 emplace 返回 reference ,破坏了与 C++17 之前容器的兼容性 返回 decltype(auto)

参见

在栈顶插入元素
(公开成员函数)
移除栈顶元素
(公开成员函数)