Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误的\u变体\u访问不工作_C++_Stl_C++17 - Fatal编程技术网

C++ 错误的\u变体\u访问不工作

C++ 错误的\u变体\u访问不工作,c++,stl,c++17,C++,Stl,C++17,当变量不在列表中时,我试图获取一个std::bad_variant_access异常。但是下面的代码不起作用,它返回一个隐式转换的ASCII int值 我应该做什么更改?该变体对类型选择非常严格 #include <iostream> #include <variant> using namespace std; struct printer { void operator()(int x) { cout << x <<

当变量不在列表中时,我试图获取一个
std::bad_variant_access
异常。但是下面的代码不起作用,它返回一个隐式转换的ASCII int值

我应该做什么更改?该变体对类型选择非常严格

#include <iostream>
#include <variant>
using namespace std;

struct printer
{
    void operator()(int x) {
        cout << x << "i"<<endl;

    }
    void operator()(float x) {
        cout << x << "f"<<endl;
    }
    void operator()(double x)
    {
        cout << x << "d" << endl;;
    }
};
int main() {

    using my_variant = std::variant<int, float, double>;
    my_variant v0('c');

    try {
        std::visit(printer{}, v0);
        }

    catch(const std::bad_variant_access& e) {
        std::cout << e.what() << '\n';
    }

    return 0;
}
#包括
#包括
使用名称空间std;
结构打印机
{
void运算符()(int x){

cout根据以下文件:

variant的构造函数执行以下操作:

构造一个变量,该变量包含可选类型T_j,如果同时作用域中类型…中的每个T_i都有虚函数F(T_i)的重载,则该变量将通过表达式F(std::forward(T))的重载解析来选择。[…]


也就是说,std::variant将从传递的参数中获取可构造的第一个类型。在这种情况下,
int
可从
char
中构造,因此变量将被分配为这样的类型。

std::visit
仅在变量为(C++17,请参阅N4659 23.7.3.5)时触发
坏的变量访问
异常[变体.状态])

这意味着,如果您试图以引发异常的方式设置变量值,该变量将处于“无值”状态,因此不允许访问

要触发它,我们可以如下更改代码:

struct S{

    operator int() const{throw 42;}
};

struct printer{//as before};

int main() {
    using my_variant = std::variant<int, float, double>;
    my_variant v0{'c'};

    try{
       v0.emplace<0>(S());
    }catch(...){}

    try {
        std::visit(printer{}, v0);
    }
    catch(const std::bad_variant_access& e) {
        std::cout << e.what() << '\n';
    }
}
结构{
运算符int()常量{throw 42;}
};
结构打印机{//与以前一样};
int main(){
使用my_variant=std::variant;
my_变体v0{'c'};
试一试{
v0.侵位(S());
}捕获(…){}
试一试{
std::visit(打印机{},v0);
}
捕获(常数标准::错误的变量访问和e){

std::cout有没有办法阻止它并更加严格?我的客户机代码正在这样做,因为整个代码中断应该可以在
std::variant
周围创建一个具有更严格构造规则的包装器,但我不建议进入兔子洞。@Hariom Singh没有,因为您的问题发生在t分配时间。当您调用
visit()
时已经太晚了,变量已经被锁定为
int
。您对“first”有一个非常奇怪的定义。