T
(及其亲属)的一个众所周知的问题是,当仅创建一个临时对象时,它无法按预期方式工作。
例如:
&'a i32
我尝试了使用引用限定符来创建替换项,以防止创建临时对象(在编译时)。以下代码是徒劳的尝试:
struct HandlesT<T: 'static> {
handler: Box<Fn(T) + 'static>,
}
impl<T: 'static> HandlesT<T> {
pub fn new<F: Fn(T) + 'static>(handler: F) -> HandlesT<T> {
HandlesT {
handler: Box::new(handler),
}
}
}
trait IsStatic: 'static {}
impl<T: 'static> IsStatic for HandlesT<T> {}
fn try_nonstatic_t<'a>() {
let handles_t = HandlesT {
handler: Box::new(|i: &'a i32| {}),
};
}
这不起作用,因此问题变为:
是否可以通过编译器拒绝error[E0477]: the type `&'a i32` does not fulfill the required lifetime
--> src\lib.rs:17:21
|
17 | let handles_t = HandlesT {
| ^^^^^^^^
|
= note: type must satisfy the static lifetime
并接受std::lock_guard
的方式编写类?
答案 0 :(得分:4)
如果可以使用c++17
,则可以将[[nodiscard]]
属性与工厂功能一起使用。
class [[nodiscard]] my_lock{
my_lock()=default;
friend my_lock lock();
};
[[nodiscard]] my_lock lock(){return {};}
int main(){
{ lock(); } //warning for discard return value
{ auto l = lock();}
}
答案 1 :(得分:0)
让我重新解释您的问题,而不是:
是否可以用编译器拒绝A并接受B的方式编写类?
我要读为
我的编译器是否可以拒绝A并接受B?
是的,这可能取决于编译器,而无需编写自己的类。我对clang非常熟悉,但是其他编译器或静态分析器中也会存在类似的检查。
对于c,-Wunused-value -Werror
将完成工作。第一个激活警告,第二个将警告升级为错误。
我个人希望启用所有警告,并明确禁用那些您有理由不遵守的警告,包括有关原因的文档。