为什么 std::optional 运算符* 没有 has_value() 的调试模式断言
Why does std::optional operator* not have debug mode assertion for has_value()?
我完全理解,由于性能原因,std::optional
中的operator*
不会对包含值的实际存在进行任何检查。但是,在调试模式下,性能考虑无关紧要,在调试模式下应该做出某种断言对我来说很有意义。
Visual Studio似乎没有这样的断言(尽管我不确定其他编译器(。
我的问题是:编译器不会在调试模式下做出这样的断言,或者它只是一个缺失的功能,有什么根本原因吗?
编译器不会在调试模式下做出这样的断言,或者它只是一个缺失的功能,有什么根本原因吗?
违反网上解决规则。 std::optional
是一个类模板,因此在标头中实现。标头中不同预处理器符号的代码的不同行为非常危险。考虑这个例子(未经测试,你会明白这一点(:
clang++ -DNDEBUG usesOptionalOfInt.cpp -shared -c -o myLib.so
clang++ alsoUsesOptionalOfInt.cpp main.cpp -lmyLib -o ./ub-please
在那里,你带着未定义的行为去。请注意,在此示例中,std::optional::operator*
的差异实际上不太可能造成任何伤害,但您仍然希望避免这些情况。
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 资源管理设计模式
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 小字符串优化(调试与发布模式)
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 为什么 std::optional 运算符* 没有 has_value() 的调试模式断言
- 断言未通过特征调试模式
- 调试断言失败-DirectShow筛选器正在调用OpenCV函数-仅限发布模式
- 如何在调试模式下绕过单元测试中的断言
- 优化、断言和发布模式