bad_variant_access不起作用
bad_variant_access not working
当变体不在列表中时,我正在尝试获得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;
}
输出:
99i
而我期待得到std::bad_variant_access
例外
法典
std::visit
只有在变体valueless_by_exception时才会触发bad_variant_access
异常(C++17,请参阅 N4659 23.7.3.5 [variant.status] (
这意味着,如果您尝试以引发异常的方式设置变体值,则该变体将处于"无值"状态,因此不允许访问。
要触发它,我们可以像这样更改代码:
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';
}
}
演示
Frank 已经回答了为什么你可以首先使用char
(通过重载选择构造(来构造你的变体。
您不能通过尝试首先以抛出的方式构造变体来触发bad_variant_access
,因为 [variant.ctor] 指示构造函数将重新引发该异常(在本例中为int
(。
根据std::variant
的文档:
变量的构造函数执行以下操作:
构造一个包含替代类型的变体T_j,如果同时在范围内对 Types... 的每个T_i都有虚函数 F(T_i( 的重载,则表达式 F(std::forward(t((将通过重载分辨率选择表达式 F(std::forward(t((。[...]
即 std::variant 将获得第一个可从传递的参数构造的类型。在这种情况下,int
可以从char
构造,因此变体被赋值为这样。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用