在此示例中,std ::变体如何变为有价值_by_exception
How does std::variant becomes valueless_by_exception in this example?
这是受CPPReference
的示例启发的示例struct S {
operator int() { throw 42; }
};
int main(){
variant<float, int> v{12.f}; // OK
cout << std::boolalpha << v.valueless_by_exception() << "n";
try{
v.emplace<1>(S()); // v may be valueless
}
catch(...){
}
cout << std::boolalpha << v.valueless_by_exception() << "n";
}
对于一个编译器,我尝试了IT输出
false,true
意味着emplace
导致变体变得无价值
我不明白的是如何发生。特别是我不明白为什么要调用 emplace
,我希望该程序什至不称呼它,因为从s转换为int grom thr。
请注意相关std::variant::emplace
超载的签名:
template <size_t I, class... Args>
std::variant_alternative_t<I, variant>& emplace(Args&&... args);
需要一包转发参考。这意味着在评估函数参数时,未调用从S
到int
的转换操作员;它被称为emplace
的主体内部。由于试图将int
构造到位将失败,因此这种变体的例外是毫无价值的。
也许可以实现variant
,以便对于易于移动的类型,在尝试构造之前保存旧值对标准给出的类型实现的限制。
相关文章:
- Python中的for循环与C++有何不同
- 有可能使shared_ptr协变吗
- QNX Momentics: GoogleMock - 返回有价值,在函数中返回 void 错误
- 在C++中释放内存期间,迭代器与指针有何不同
- 指针投射:指针有价值吗?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 在程序变得低效之前,允许多少新的[]和删除[]分配是否有限制?
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 收益率和回报有何不同?
- 覆盖私有功能,它与受保护功能有何不同?
- 无论代码长度如何,以下代码的内存要求有何不同?
- "virtual"对C++析构函数有何影响?
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- 为什么"断言"宏即使使用"NDEBUG"也有价值?
- C - 如何编写一个函数,返回真实有价值函数的导数,而不是导数的值
- 在此示例中,std ::变体如何变为有价值_by_exception
- 当定义与运算符有价值时,#define 如何在编程中工作
- 根据模板参数返回有价值的
- 一个计算机专业二年级的学生能做些什么,这在未来可能会被认为是有价值的
- 请推荐一本有价值的关于多线程和boost的书.线程或c++ 11