首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++14中标记为不推荐的函数参数

在C++14中标记为不推荐的函数参数
EN

Stack Overflow用户
提问于 2019-05-28 10:51:45
回答 3查看 779关注 0票数 12

在阅读这篇博客文章及其评论时,我注意到它给出了将特定函数参数标记为不推荐的方法的可能性,如(从文章中摘自):

代码语言:javascript
复制
// Deprecate a function parameter
int triple([[deprecated]] int x);

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

编辑:

要查看它的运行情况,有一个可编译的示例金螺栓

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-28 12:09:35

规则是除其他外,该属性在变量声明上有效。 (广义)。函数参数中的此类声明是不允许的。

最初的建议N3394也没有提到这样的用例,原始特性GCC (其中的无论接受等效的用法)或在VS (我没有检查Clang)的文档也没有提到。

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

像Artyer所探索的那样,记录被废弃的默认参数会有用吗?是的,有可能,而且含糊不清。但正如Artyer也发现的,主流编译器对这种使用并没有做出有益的反应。

因此,目前,它并不有用,而且语言特性在这种情况下并没有被特别设计成有用的。

票数 4
EN

Stack Overflow用户

发布于 2019-05-28 11:04:24

假设你有这样的功能:

代码语言:javascript
复制
void* allocate(std::size_t sz, void* hint = nullptr) {
    // if you give `hint` it *might* be more efficient
}

然后,您决定不再值得在hint基础上做一些事情。所以你会这么做:

代码语言:javascript
复制
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还会发出关于使用不推荐参数的警告,因此这似乎是一个错误。如果它确实禁用了未使用的param警告,那将是[[deprecated]]的另一个用例。

票数 10
EN

Stack Overflow用户

发布于 2019-05-28 11:03:18

设想一个库已经实现、使用和维护多年了。此库用于多个项目。

如果要简单地删除参数,所有项目都必须立即修改源代码,以便在升级到新的库版本后能够再次编译。

如果将默认值添加到参数中,但不再使用该参数,则项目仍将编译而不作任何更改,但没有人会注意到某些内容发生了更改,并且可能由该参数控制的某些行为/特性不再起作用。

因此,通过将参数标记为不建议使用的参数,这些项目可以编译而不作任何更改,但它们会收到警告,说明某些内容已经更改,并且应该更改源代码,因为这个参数迟早会消失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56340596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档