命名空间
变体
动作

std::variant<Types...>::emplace

来自 cppreference.com
< cpp‎ | utility‎ | variant
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三元比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
template< class T, class... Args >
T& emplace( Args&&... args );
(1) (自 C++17 起)
(自 C++20 起为 constexpr)
template< class T, class U, class... Args >
T& emplace( std::initializer_list<U> il, Args&&... args );
(2) (自 C++17 起)
(自 C++20 起为 constexpr)
template< std::size_t I, class... Args >
std::variant_alternative_t<I, variant>& emplace( Args&&... args );
(3) (自 C++17 起)
(自 C++20 起为 constexpr)
template< std::size_t I, class U, class... Args >

std::variant_alternative_t<I, variant>&

    emplace( std::initializer_list<U> il, Args&&... args );
(4) (自 C++17 起)
(自 C++20 起为 constexpr)

在现有 variant 对象中就地创建一个新值

1) 等同于 emplace<I>(std::forward<Args>(args)...), 其中 ITTypes... 中的零基索引。
  • 此重载仅在 std::is_constructible_v<T, Args...>trueTTypes... 中恰好出现一次时参与重载解析。
2) 等同于 emplace<I>(il, std::forward<Args>(args)...), 其中 ITTypes... 中的零基索引。
3) 首先,销毁当前包含的值(如果有)。然后 直接初始化 包含的值,就好像用参数 std::forward<Args>(args)... 构造类型 T_I 的值一样。如果抛出异常,*this 可能变为 valueless_by_exception
  • 此重载仅在 std::is_constructible_v<T_I, Args...>true 时参与重载解析。
  • 如果 I 不小于 sizeof...(Types),则为编译时错误。
4) 首先,销毁当前包含的值(如果有)。然后 直接初始化 包含的值,就好像用参数 il, std::forward<Args>(args)... 构造类型 T_I 的值一样。如果抛出异常,*this 可能变为 valueless_by_exception

内容

[编辑] 参数

args - 用于构造新值的构造函数参数
il - 用于构造新值的 initializer_list 参数

[编辑] 返回值

对新包含值的引用。

[编辑] 异常

1-4) 在初始化包含值期间抛出的任何异常。

[编辑] 注释

功能测试 Std 功能
__cpp_lib_variant 202106L (C++20)
(DR)
完全 constexpr std::variant (1-4)

[编辑] 例子

#include <iostream>
#include <string>
#include <variant>
 
int main()
{
    std::variant<std::string> v1;
    v1.emplace<0>("abc"); // OK
    std::cout << std::get<0>(v1) << '\n';
    v1.emplace<std::string>("def"); // OK
    std::cout << std::get<0>(v1) << '\n';
 
    std::variant<std::string, std::string> v2;
    v2.emplace<1>("ghi"); // OK
    std::cout << std::get<1>(v2) << '\n';
    // v2.emplace<std::string>("abc"); -> Error
}

输出

abc
def
ghi

[编辑] 缺陷报告

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

DR 应用于 发布的行为 正确行为
P2231R1 C++20 emplace 不是 constexpr,而所需的运算可以在 C++20 中是 constexpr 成为 constexpr

[编辑] 另请参阅

分配一个 variant
(公共成员函数) [编辑]