繁体   English   中英

在C ++ 14中标记为已弃用的函数参数

[英]Mark as deprecated function parameters in C++14

阅读这篇博客文章及其评论,我注意到它举例说明了将特定函数参数标记为已弃用的可能性,如(摘自帖子):

// Deprecate a function parameter
int triple([[deprecated]] int x);

现在我想知道,这个功能有什么好的用例? 该帖子的评论中没有人或我搜索过的任何其他地方似乎都有线索。

编辑:

为了看到它在行动,有一个关于goldbolt的可编辑的例子

假设你有这样的功能:

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标志禁用“unused参数”警告,但事实并非如此。 使用(void) deprecated_parameter也会发出关于使用不推荐使用的参数的警告,因此这似乎是一个错误。 如果它确实禁用了未使用的param警告,那将是[[deprecated]]另一个用例。

规则是该属性在(其中包括)变量声明 (广泛地) 上是有效的 在函数参数中找到的此类声明并不是特别允许的。

最初的提案N3394也没有提到这样的用例,也没有提到GCC中原始功能的文档( 无论是否接受等效用法 )或VS (我没有检查Clang)。

因此,我认为这是一个“意外”,这是允许的,而不是任何人真正想到的有用的东西。

如Artyer所探讨的那样,记录弃用的默认参数是否有用? 是的,潜在的,模糊的。 但正如Artyer所发现的那样,主流编译器实际上并没有以有用的方式对这种用法做出反应。

因此,目前,它没有用,并且语言功能并没有特别设计为在这种情况下有用。

想象一下,实施,使用和维护多年的图书馆。 该库用于多个项目。
如果您只是删除参数,所有项目都必须立即调整源代码,以便在升级到新库版本后再次编译。
如果将一个默认值添加到参数中,但参数不再使用,那么项目仍然会在没有任何更改的情况下进行编译,但是没有人会注意到某些内容已经发生了变化,并且可能是由此参数控制的某些行为/功能不再工作了。

因此,通过将参数标记为已弃用,项目可以在不进行更改的情况下进行编译,但是它们会收到警告,指出某些内容已更改并且应该更改其源代码,因为此参数迟早会消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM