如果在其他地方涵盖了这一点,则表示歉意。我的挫败感之一是,每当我试图检查呼叫功能后的条件时,我通常都必须将返回变量装饰为未使用的返回变量,以避免编译器警告:
auto const count [[maybe_unused]] = some_map.erase(some_key);
assert(count == 1);
属性的原因很明显 - assert
是一个预处理器宏,如果设置了NDEBUG
,则可以扩展到NO-OP,或者如果未设置NDEBUG
,则实际上评估了表达式。在前一种情况下,count
在技术上不使用,因此编译器警告。
随着C 20中的合同,count
变量是否仍未使用?换句话说,我可以做:
auto const count = some_map.erase(some_key); // no attribute
[[assert: count == 1]];
或我必须做一些丑陋的事情:
auto const count [[maybe_unused]] = some_map.erase(some_key);
[[assert: count == 1]];
还是此实现定义的行为?
标准根本无法定义使用。也就是说,合同主张在道德上等同于
if(__check_contract<level>())
if(!condition) __handle_violation(…);
和编译器通常不会警告使用条件是字面的false
(由于生成的代码,除其他原因(。所以你应该没事的。