请考虑以下代码:
#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 &
,因此工厂在离开范围之前一直有效(由于参考折叠)。我的问题是
foo
对象是否导致未定义的行为? 编辑: 我认为这已经足够了,但我知道我必须澄清一下。我希望实现这样的目标:
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
班。
答案 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。
的结构