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”有一个非常奇怪的定义。