4

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

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

我的问题是:编译器不会在调试模式下做出这样的断言,或者它只是一个缺失的特性,有什么根本原因吗?

4

1 回答 1

5

为什么编译器不会在调试模式下做出这样的断言,或者它只是一个缺失的特性,有什么根本原因吗?

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

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

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

于 2019-04-17T12:24:02.093 回答