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

时间:2019-05-28 10:51:45

标签: c++ c++14 deprecated deprecation-warning

在阅读this blog post及其注释时,我注意到它举例说明了将特定的功能参数标记为已弃用的可能性,例如(摘自该帖子):

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

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

编辑:

要查看其运行情况,有一个可编译的示例on goldbolt

3 个答案:

答案 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 GCCregardless accepts the equivalent usage)或{{3 }}(我没有检查Clang)。

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

像Artyer探索的那样,记录不推荐使用的默认参数是否有用?是的,可能且隐含地。但是正如Artyer所发现的那样,主流编译器实际上并没有以有用的方式对这种用法做出反应。

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

答案 2 :(得分:0)

想象一个实现,使用和维护多年的库。该库用于多个项目。
如果仅删除参数,则所有项目在升级到新的库版本后,都必须立即改编源代码,以便能够再次进行编译。
如果将默认值添加到该参数,但是该参数不再使用,则项目仍将编译而没有任何更改,但是没有人会注意到有些更改,并且也许此参数控制的某些行为/功能确实不再工作。

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