发布于 2019-05-28 12:09:35
规则是除其他外,该属性在变量声明上有效。 (广义)。函数参数中的此类声明是不允许的。
最初的建议N3394也没有提到这样的用例,原始特性GCC (其中的无论接受等效的用法)或在VS (我没有检查Clang)的文档也没有提到。
因此,我认为这是一个“意外”,这是允许的,而不是任何人真正认为是有用的东西。
像Artyer所探索的那样,记录被废弃的默认参数会有用吗?是的,有可能,而且含糊不清。但正如Artyer也发现的,主流编译器对这种使用并没有做出有益的反应。
因此,目前,它并不有用,而且语言特性在这种情况下并没有被特别设计成有用的。
发布于 2019-05-28 11:04:24
假设你有这样的功能:
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还会发出关于使用不推荐参数的警告,因此这似乎是一个错误。如果它确实禁用了未使用的param警告,那将是[[deprecated]]的另一个用例。
发布于 2019-05-28 11:03:18
设想一个库已经实现、使用和维护多年了。此库用于多个项目。
如果要简单地删除参数,所有项目都必须立即修改源代码,以便在升级到新的库版本后能够再次编译。
如果将默认值添加到参数中,但不再使用该参数,则项目仍将编译而不作任何更改,但没有人会注意到某些内容发生了更改,并且可能由该参数控制的某些行为/特性不再起作用。
因此,通过将参数标记为不建议使用的参数,这些项目可以编译而不作任何更改,但它们会收到警告,说明某些内容已经更改,并且应该更改源代码,因为这个参数迟早会消失。
https://stackoverflow.com/questions/56340596
复制相似问题