为什么 std::optional 运算符* 没有 has_value() 的调试模式断言

Why does std::optional operator* not have debug mode assertion for has_value()?

本文关键字:模式 断言 value 调试 has optional std 运算符 为什么 没有      更新时间:2023-10-16

我完全理解,由于性能原因,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*的差异实际上不太可能造成任何伤害,但您仍然希望避免这些情况。