可以将类对象创建为仅左值吗?

时间:2018-12-29 04:04:08

标签: c++ c++11 mutex

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的方式编写类?

2 个答案:

答案 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将完成工作。第一个激活警告,第二个将警告升级为错误。

我个人希望启用所有警告,并明确禁用那些您有理由不遵守的警告,包括有关原因的文档。