gpt4 book ai didi

C++20 契约和未使用的变量

转载 作者:可可西里 更新时间:2023-11-01 15:25:04 25 4
gpt4 key购买 nike

如果这已在别处涵盖,我们深表歉意。我的挫折之一是每当我试图检查调用函数的后置条件时,我经常必须将返回变量修饰为未使用以避免编译器警告:

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]];

或者这是实现定义的行为?

最佳答案

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

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

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

关于C++20 契约和未使用的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56956638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com