在阅读this blog post及其注释时,我注意到它举例说明了将特定的功能参数标记为已弃用的可能性,例如(摘自该帖子):
// Deprecate a function parameter
int triple([[deprecated]] int x);
现在我想知道,这种功能的好用例是什么?在该帖子或我搜索过的其他地方的评论中,没有人似乎有线索。
编辑:
要查看其运行情况,有一个可编译的示例on goldbolt
答案 0 :(得分:10)
假设您具有这样的功能:
void* allocate(std::size_t sz, void* hint = nullptr) {
// if you give `hint` it *might* be more efficient
}
然后,您决定不再需要根据hint
进行操作。因此,您可以这样做:
void* allocate(std::size_t sz, [[deprecated]] void* hint = nullptr) {
// `hint` is ignored. The compiler warns me if I use it in the
// function body accidentally, and people reading the function
// signature can see that it is probably going to be ignored.
}
这使库可以保留相同的签名/ ABI(因此,您无需重新编译使用它的东西,而遗留代码仍可以继续使用而不会造成任何损害),并且还可以防止意外地再次使用它更改功能时。
但这主要是针对功能的开发人员,而不是功能的用户,因此他们知道为什么会有一个看似“无用”的参数。
我还认为这将禁用gcc / clang中带有-Werror=unused-parameter
标志的“未使用的参数”警告,但事实并非如此。使用(void) deprecated_parameter
还会发出有关使用不推荐使用的参数的警告,因此这似乎是一个错误。如果确实禁用了未使用的参数警告,那将是[[deprecated]]
的另一个用例。
答案 1 :(得分:3)
规则是the attribute is valid on, amongst other things, variable declarations(广泛使用)。在函数参数中发现的此类声明不是特别允许的。
原始提案N3394也没有提及这种用例,原始功能in GCC(regardless accepts the equivalent usage)或{{3 }}(我没有检查Clang)。
这样,我认为这是一个“意外”,而不是任何人真正想到的有用的东西。
像Artyer探索的那样,记录不推荐使用的默认参数是否有用?是的,可能且隐含地。但是正如Artyer所发现的那样,主流编译器实际上并没有以有用的方式对这种用法做出反应。
因此,目前,它没有有用,并且语言功能并未专门设计为在这种情况下有用。
答案 2 :(得分:0)
想象一个实现,使用和维护多年的库。该库用于多个项目。
如果仅删除参数,则所有项目在升级到新的库版本后,都必须立即改编源代码,以便能够再次进行编译。
如果将默认值添加到该参数,但是该参数不再使用,则项目仍将编译而没有任何更改,但是没有人会注意到有些更改,并且也许此参数控制的某些行为/功能确实不再工作。
因此,通过将参数标记为已弃用,项目可以在不进行更改的情况下进行编译,但是它们会警告您某些更改,并且应该更改其源代码,因为该参数迟早会消失。