【问题标题】:C++20 contracts and unused variablesC++20 合约和未使用的变量
【发布时间】: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


【解决方案1】:

标准根本没有定义used。也就是说,合同断言在道德上等同于

if(__check_contract<level>())
  if(!condition) __handle_violation(…);

即使使用条件是literal false,编译器通常也不会发出警告(由于生成的代码等原因)。所以你应该没事。

【讨论】:

    猜你喜欢
    • 2022-03-29
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2022-01-08
    • 2014-07-25
    • 2021-06-22
    相关资源
    最近更新 更多