将右值引用存储在模板

时间:2018-03-14 21:29:11

标签: c++ c++11 templates rvalue-reference

请考虑以下代码:

#include <functional>

template<class T>
class factory {
public:
    factory(T &&t) : t_(std::forward<T>(t)) {}

private:
    T &&t_;
};

template<class T>
factory<T> make_factory(T &&t) {
    return factory<T>(std::forward<T>(t));
}

int main(){
    int i = 3;
    auto bar = make_factory(i); //now it will store int &
    auto foo = make_factory(5); //now will store int &&
    return 0;
}

这当然是代码的简化,但显示了我的一般想法 - 我正在考虑存储对rvalues的引用。据我所知,在第一种情况下,推导出的类型将为int &,因此工厂在离开范围之前一直有效(由于参考折叠)。我的问题是

  1. foo对象是否导致未定义的行为?
  2. 如果没有,存储的右值参考有效期多长(我的意思是,它的范围是什么)?
  3. 我有什么警告吗?
  4. 编辑: 我认为这已经足够了,但我知道我必须澄清一下。我希望实现这样的目标:

    template<class T>
    class factory {
    public:
        factory(T &&t) : t_(std::forward<T>(t)) {}
    
        auto make() const & {
            return wrap(t_);
        }
    
        auto make() && {
           return wrap(/*what here, move(t_), forward<T>(t_) ?*/);
        }
    private:
        T t_;//or maybe T&& here?
    };
    

    除非我真的必须,否则我不想复制该成员。我想做一些事情,比如转发factory班。

1 个答案:

答案 0 :(得分:0)

通常这样做:

template<class T>
class factory {
public:
  factory(T &&t) : t_(std::forward<T>(t)) {}

private:
  T t_; // could be a lvalue ref
};

它只是有效。真。是的,那个案子也是。

Rvalues不应该超过他们的封闭声明;所以你的make工厂不应该返回包含rvalue ref。

的结构