C ++ 17引入了该[[nodiscard]]
属性,该属性允许程序员以一种方式标记函数,如果返回的对象被调用者丢弃,则编译器将生成警告。可以将相同的属性添加到整个类类型。
我已经在最初的提案中了解了使用此功能的动机,并且我知道C ++ 20会将属性添加到类似的标准函数中std::vector::empty
,其名称并未传达关于返回值的明确含义。
这是一个很酷的实用功能。实际上,这似乎太有用了。在我所读过的所有地方[[nodiscard]]
,人们都在讨论它,就好像您只是将其添加到少数几个函数或类型中而忽略了其余的函数或类型一样。但是,为什么不可丢弃的值应该是特例,尤其是在编写新代码时?丢弃的返回值通常不是bug还是至少浪费资源?
C ++本身的设计原则之一不是编译器应该捕获尽可能多的错误吗?
如果是这样,那么为什么不将[[nodiscard]]
您自己的非传统代码添加到几乎每个单个非void
函数和几乎每个单个类类型中呢?
我已经尝试过用自己的代码来做到这一点,并且它工作得很好,除了它非常冗长,以至于开始看起来像Java。使编译器默认警告丢弃的返回值 似乎更自然,除非您标记意图[*]的其他少数情况。
在标准提案,博客条目,Stack Overflow问题或互联网上的其他任何地方,我对这种可能性的讨论都为零,我一定会错过一些东西。
为什么这样的机制在新的C ++代码中没有意义?冗长是不是[[nodiscard]]
几乎无处不在的唯一理由吗?
[*]从理论上讲,您可能拥有类似[[maydiscard]]
属性的内容,也可以将其追溯地添加到printf
标准库实现中的功能中。
const
可以臃肿否则“简单”类(或者更确切地说,“普通老式数据对象”)显着地在C ++中。
std::vector
或)更相关,std::unique_ptr
在类定义中,您只需要数据成员即可。我曾经用过两种语言。Java是一种不错的语言,但是更加冗长。
operator =
例如。和std::map::insert
。