C++ C++;20个合同和未使用的变量

C++ C++;20个合同和未使用的变量,c++,language-lawyer,c++20,C++,Language Lawyer,C++20,如果其他地方已涵盖此内容,则表示歉意。我的一个挫折是,每当我试图检查调用函数的post条件时,我通常必须将返回变量修饰为未使用,以避免编译器警告: 自动常量计数[[可能未使用]]=一些映射。擦除(一些键); 断言(计数=1); 该属性的原因很清楚--assert是一个预处理器宏,如果设置了NDEBUG,该宏将扩展为无运算;如果未设置NDEBUG,则实际计算表达式。在前一种情况下,count在技术上没有使用,因此编译器发出警告 随着C++20中契约的引入,count变量是否仍然被认为是未使用的?

如果其他地方已涵盖此内容,则表示歉意。我的一个挫折是,每当我试图检查调用函数的post条件时,我通常必须将返回变量修饰为未使用,以避免编译器警告:

自动常量计数[[可能未使用]]=一些映射。擦除(一些键);
断言(计数=1);
该属性的原因很清楚--
assert
是一个预处理器宏,如果设置了
NDEBUG
,该宏将扩展为无运算;如果未设置
NDEBUG
,则实际计算表达式。在前一种情况下,
count
在技术上没有使用,因此编译器发出警告

随着C++20中契约的引入,
count
变量是否仍然被认为是未使用的?换言之,我能否做到:

auto const count=some_map.erase(some_key);//无属性
[[assert:count==1]];
或者我必须做一些丑陋的事情,比如:

自动常量计数[[可能未使用]]=一些映射。擦除(一些键);
[[assert:count==1]];

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

标准根本没有定义。这就是说,合同主张在道德上等同于

if(__check_contract<level>())
  if(!condition) __handle_violation(…);
if(\u检查\u合同())
如果(!条件)uu处理违反(…);

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

@Barry谢谢。在当前的C++标准中,或者在一个变量被认为未使用的地址的契约建议中,有什么地方吗?还有一百万份合同相关的提案,所以。。。耸耸肩。警告完全是QoI。也就是说,我不认为任何高质量的实现会在这里发出警告。请注意,合同是从C++20中拉出来的,因为在提供哪些选项和设置方面缺乏一致意见。类似的功能稍后可能会再次出现。