为什么 std::Optional Operator* 没有 has_value() 的调试模式断言?

Fra*_*nez 5 c++ visual-studio stdoptional

我完全理解,由于性能原因,operator*instd::optional不会对所包含值的实际存在进行任何检查。然而,在调试模式下,性能考虑并不重要,并且在调试模式下应该做出某种断言对我来说很有意义。

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

我的问题是:编译器不会在调试模式下做出这样的断言是否有任何根本原因,或者它只是一个缺失的功能?

lub*_*bgr 6

编译器不会在调试模式下做出这样的断言是否有任何根本原因,或者它只是一个缺失的功能?

ODR 违规行为。std::optional是一个类模板,因此在标头中实现。标头内针对不同预处理器符号的代码的不同行为非常危险。考虑这个例子(未经测试,你会明白的):

clang++ -DNDEBUG usesOptionalOfInt.cpp -shared -c -o myLib.so
clang++ alsoUsesOptionalOfInt.cpp main.cpp -lmyLib -o ./ub-please
Run Code Online (Sandbox Code Playgroud)

就这样,你就得到了未定义的行为。请注意,在此示例中,差异std::optional::operator*实际上不太可能造成任何损害,但您仍然希望避免这些情况。