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

时间:2019-04-17 12:18:43

标签: c++ visual-studio stdoptional

我完全理解,由于性能原因,operator*中的std::optional不会对包含值的实际存在进行任何检查。但是,在调试模式下,性能考量无关紧要,在调试模式下应该进行某种断言对我来说很有意义。

Visual Studio似乎没有这样的断言(尽管我不确定其他编译器)。

我的问题是:编译器不会在调试模式下做出这样的断言是根本原因还是仅仅是缺少的功能?

1 个答案:

答案 0 :(得分:4)

  

编译器不会在调试模式下做出这样的断言还是仅仅是缺少的功能,有任何根本原因吗?

违反了ODR。 std::optional是一个类模板,因此在标头中实现。标头中用于不同预处理器符号的代码的不同行为具有同样的危险。考虑以下示例(未经测试,您会明白这一点):

clang++ -DNDEBUG usesOptionalOfInt.cpp -shared -c -o myLib.so
clang++ alsoUsesOptionalOfInt.cpp main.cpp -lmyLib -o ./ub-please

出现不确定的行为。请注意,在此示例中,std::optional::operator*中的差异实际上不会造成任何损害,但仍然-您想避免这些情况。