Namespaces
Variants

std::any:: operator=

From cppreference.net
Utilities library
any & operator = ( const any & rhs ) ;
(1) (自 C++17 起)
any & operator = ( any && rhs ) noexcept ;
(2) (自 C++17 起)
template < typename ValueType >
any & operator = ( ValueType && rhs ) ;
(3) (自 C++17 起)

为所含值分配内容。

1) 通过复制 rhs 的状态进行赋值,如同执行 std:: any ( rhs ) . swap ( * this )
2) 通过移动 rhs 的状态进行赋值,如同执行 std:: any ( std :: move ( rhs ) ) . swap ( * this ) 。赋值后 rhs 处于有效但未指定的状态。
3) 如同通过 std:: any ( std:: forward < ValueType > ( rhs ) ) . swap ( * this ) 的方式,赋值 rhs 的类型和值。此重载仅当 std:: decay_t < ValueType > std::any 类型不同,且 std:: is_copy_constructible_v < std:: decay_t < ValueType >> true 时参与重载决议。

目录

模板参数

ValueType - 所含值的类型
类型要求
-
std:: decay_t < ValueType > 必须满足 CopyConstructible 的要求。

参数

rhs - 要赋值其包含值的对象

返回值

* this

异常

1,3) 抛出 std::bad_alloc 或所包含类型的构造函数抛出的任何异常。 若因任何原因抛出异常,这些函数不产生任何效果( 强异常安全保证 )。

示例

#include <any>
#include <cassert>
#include <iomanip>
#include <iostream>
#include <string>
#include <typeinfo>
int main()
{
    using namespace std::string_literals;
    std::string cat{"cat"};
    std::any a1{42};
    std::any a2{cat};
    assert(a1.type() == typeid(int));
    assert(a2.type() == typeid(std::string));
    a1 = a2; // 重载 (1)
    assert(a1.type() == typeid(std::string));
    assert(a2.type() == typeid(std::string));
    assert(std::any_cast<std::string&>(a1) == cat);
    assert(std::any_cast<std::string&>(a2) == cat);
    a1 = 96; // 重载 (3)
    a2 = "dog"s; // 重载 (3)
    a1 = std::move(a2); // 重载 (2)
    assert(a1.type() == typeid(std::string));
    assert(std::any_cast<std::string&>(a1) == "dog");
    // a2 的状态有效但未指定。实际上,
    // 在 gcc/clang 中为 void,在 msvc 中为 std::string。
    std::cout << "a2.type(): " << std::quoted(a2.type().name()) << '\n';
    a1 = std::move(cat); // 重载 (3)
    assert(*std::any_cast<std::string>(&a1) == "cat");
    // cat 的状态有效但不确定:
    std::cout << "cat: " << std::quoted(cat) << '\n';
}

可能的输出:

a2.type(): "void"
cat: ""

参见

构造 any 对象
(公开成员函数)