我完全理解,由于性能原因,operator*
instd::optional
不会对包含值的实际存在进行任何检查。然而,在调试模式下,性能考虑应该无关紧要,在调试模式下应该做出某种断言对我来说很有意义。
Visual Studio 似乎没有这样的断言(尽管我不确定其他编译器)。
我的问题是:编译器不会在调试模式下做出这样的断言,或者它只是一个缺失的特性,有什么根本原因吗?
我完全理解,由于性能原因,operator*
instd::optional
不会对包含值的实际存在进行任何检查。然而,在调试模式下,性能考虑应该无关紧要,在调试模式下应该做出某种断言对我来说很有意义。
Visual Studio 似乎没有这样的断言(尽管我不确定其他编译器)。
我的问题是:编译器不会在调试模式下做出这样的断言,或者它只是一个缺失的特性,有什么根本原因吗?
为什么编译器不会在调试模式下做出这样的断言,或者它只是一个缺失的特性,有什么根本原因吗?
ODR 违规。std::optional
是一个类模板,因此在标题中实现。不同预处理器符号的标头内代码的不同行为是危险的。考虑这个例子(未经测试,你会明白的):
clang++ -DNDEBUG usesOptionalOfInt.cpp -shared -c -o myLib.so
clang++ alsoUsesOptionalOfInt.cpp main.cpp -lmyLib -o ./ub-please
你去那里有未定义的行为。请注意,在此示例中,差异实际上不太可能std::optional::operator*
造成任何伤害,但您仍然希望避免这些情况。