【发布时间】:2019-07-09 16:06:47
【问题描述】:
抱歉,如果这已在其他地方有所提及。我的一个挫折是,每当我试图检查调用函数的后置条件时,我经常必须将返回变量修饰为未使用以避免编译器警告:
auto const count [[maybe_unused]] = some_map.erase(some_key);
assert(count == 1);
该属性的原因很明确--assert 是一个预处理器宏,如果设置了NDEBUG,则该宏扩展为无操作,如果未设置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]];
或者这是实现定义的行为?
【问题讨论】:
-
@Barry 谢谢。当前的 C++ 标准或合同提案中是否有任何地方解决了变量被视为未使用的情况?
-
对前者肯定不会。还有一百万个与合同相关的提案,所以……耸耸肩。
-
警告完全是 QoI。也就是说,我看不出任何高质量的实现会在这里发出警告。
-
请注意,合同是从 C++20 中撤出的,因为他们没有就提供的选项和设置达成一致。类似的功能可能会在以后再次出现。
标签: c++ language-lawyer c++20