在 C++14 中标记为已弃用的函数参数
Mark as deprecated function parameters in C++14
阅读 this blog post 及其评论,我注意到它给出了将特定函数参数标记为已弃用的可能性的示例,如(取自 post 的示例):
// Deprecate a function parameter
int triple([[deprecated]] int x);
现在我想知道,这样的功能有什么好的用例? post 的评论或我搜索过的任何其他地方似乎都没有线索。
编辑:
要查看实际效果,有一个可编译的示例 on goldbolt
想象一个被实施、使用和维护多年的图书馆。这个库在多个项目中使用。
如果您只是简单地删除该参数,所有项目都必须立即调整源代码才能在升级到新库版本后再次编译。
如果给参数添加一个默认值,但不再使用该参数,项目仍然可以编译,没有任何变化,但没有人会注意到有什么变化,也许一些 behaviour/feature 受此控制参数不再起作用。
因此,通过将参数标记为已弃用,项目可以在不进行任何更改的情况下进行编译,但是他们会收到一条警告,指出某些内容已更改并且他们应该更改其源代码,因为此参数迟早会消失。
假设你有这样一个函数:
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.
}
这允许库保持不变 signature/ABI(因此您不需要重新编译使用它的东西,遗留代码仍然可以继续使用它而不会造成任何伤害),并且还可以防止它改功能的时候不小心又被用了
但这主要是为了函数的开发人员,而不是函数的用户,将来他们知道为什么会有一个看似 "useless" 的参数。
我还认为这会在 gcc/clang 中使用 -Werror=unused-parameter
标志禁用 "unused parameter" 警告,但事实并非如此。使用 (void) deprecated_parameter
还会发出有关使用已弃用参数的警告,因此这似乎是一个错误。如果它确实禁用了未使用的参数警告,那将是 [[deprecated]]
.
的另一个用例
规则是the attribute is valid on, amongst other things, variable declarations(广义上)。在函数参数中发现的此类声明不是特别允许的。
原提案,N3394, doesn't mention such a use case, either, and neither does the documentation for the original feature in GCC (which regardless accepts the equivalent usage) or in VS(没查Clang)
因此,我认为 "accident" 这是允许的,而不是任何人真正认为有用的东西。
如 Artyer 探索的那样,记录已弃用的默认参数是否有用?是的,有可能,而且很模糊。但正如 Artyer 还发现的那样,主流编译器实际上并没有以有用的方式对这种用法做出反应。
因此,目前,它没有有用,而且语言功能并不是专门为在这种情况下有用而设计的。
阅读 this blog post 及其评论,我注意到它给出了将特定函数参数标记为已弃用的可能性的示例,如(取自 post 的示例):
// Deprecate a function parameter
int triple([[deprecated]] int x);
现在我想知道,这样的功能有什么好的用例? post 的评论或我搜索过的任何其他地方似乎都没有线索。
编辑:
要查看实际效果,有一个可编译的示例 on goldbolt
想象一个被实施、使用和维护多年的图书馆。这个库在多个项目中使用。
如果您只是简单地删除该参数,所有项目都必须立即调整源代码才能在升级到新库版本后再次编译。
如果给参数添加一个默认值,但不再使用该参数,项目仍然可以编译,没有任何变化,但没有人会注意到有什么变化,也许一些 behaviour/feature 受此控制参数不再起作用。
因此,通过将参数标记为已弃用,项目可以在不进行任何更改的情况下进行编译,但是他们会收到一条警告,指出某些内容已更改并且他们应该更改其源代码,因为此参数迟早会消失。
假设你有这样一个函数:
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.
}
这允许库保持不变 signature/ABI(因此您不需要重新编译使用它的东西,遗留代码仍然可以继续使用它而不会造成任何伤害),并且还可以防止它改功能的时候不小心又被用了
但这主要是为了函数的开发人员,而不是函数的用户,将来他们知道为什么会有一个看似 "useless" 的参数。
我还认为这会在 gcc/clang 中使用 -Werror=unused-parameter
标志禁用 "unused parameter" 警告,但事实并非如此。使用 (void) deprecated_parameter
还会发出有关使用已弃用参数的警告,因此这似乎是一个错误。如果它确实禁用了未使用的参数警告,那将是 [[deprecated]]
.
规则是the attribute is valid on, amongst other things, variable declarations(广义上)。在函数参数中发现的此类声明不是特别允许的。
原提案,N3394, doesn't mention such a use case, either, and neither does the documentation for the original feature in GCC (which regardless accepts the equivalent usage) or in VS(没查Clang)
因此,我认为 "accident" 这是允许的,而不是任何人真正认为有用的东西。
如 Artyer 探索的那样,记录已弃用的默认参数是否有用?是的,有可能,而且很模糊。但正如 Artyer 还发现的那样,主流编译器实际上并没有以有用的方式对这种用法做出反应。
因此,目前,它没有有用,而且语言功能并不是专门为在这种情况下有用而设计的。