std::Optional<std::any> 和 has_value() 之间的交互

Dan*_*han 1 c++ c++17 stdany stdoptional

出于调试目的,我正在编写一个函数,该函数迭代任何类型的可选变量向量以检查哪些变量已初始化,但对has_value()所有变量的检查都返回了true,尽管尚未为其中某些变量分配任何值。

我很感激任何帮助指出我的误解,因为我是 C++ 新手。代码如下。请注意,当注释行被取消注释时,if 语句会发现该变量没有值。

#include <iostream>
#include <optional>
#include <any>

bool SimpleCheck(std::vector<std::optional<std::any>> toCheck)
{
    bool res = false;
    for (int i = 0; i < toCheck.size(); ++i)
    {
        // toCheck[i] = std::nullopt;
        if (!toCheck[i].has_value())
        {
            std::cout << "item at index " << i << " had no value\n";
            res = true;
        }
    }
    return res;
}

int main() 
{
    std::optional<int> i = 5;
    std::optional<std::string> str;
    std::optional<double> doub = std::nullopt;
    bool check = SimpleCheck({i, str, doub});
    std::cout << check << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

item at index 1 had no value
item at index 2 had no value
1
Run Code Online (Sandbox Code Playgroud)

实际输出是:

0
Run Code Online (Sandbox Code Playgroud)

如果注释行未被注释,则输出为:

item at index 0 had no value
item at index 1 had no value
item at index 2 had no value
1
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 6

std::optional<double> doub = std::nullopt;
std::optional<std::any> a = doub; // it is not a copy constructor
Run Code Online (Sandbox Code Playgroud)

a不是空的,但它any是空的std::optional