【发布时间】:2017-04-17 12:41:33
【问题描述】:
考虑以下类 foo1 和 foo2
template <typename T>
struct foo1
{
T t_;
foo1(T&& t) :
t_{ std::move(t) }
{
}
};
template <typename T>
struct foo2
{
foo1<T> t_;
foo2(T&& t) :
t_{ std::forward<T>(t) }
{
}
};
是否总是foo1的构造函数代表了初始化成员变量T的正确方式?即使用std::move。
foo2的构造函数是否总是因为需要转发给foo1的构造函数而代表初始化成员变量foo1<T>的正确方法?即使用std::forward。
更新
对于使用std::move 的foo1,以下示例失败:
template <typename T>
foo1<T> make_foo1(T&& t)
{
return{ std::forward<T>(t) };
}
struct bah {};
int main()
{
bah b;
make_foo1(b); // compiler error as std::move cannot be used on reference
return EXIT_SUCCESS;
}
这是一个问题,因为我希望 T 既是引用类型又是值类型。
【问题讨论】:
-
我会让知道其背后原因的人发布完整答案,但如果您正在寻找一个快速的是/否,我一直被告知您的
foo2示例是正确。 -
这些不是“通用”(转发)引用——如果你想要一个转发引用,你需要一个模板化的构造函数。
-
这里没有作业。
-
@Lightness Races in Orbit 我已经更新了我的措辞,谢谢!
标签: c++ c++11 c++14 move-semantics perfect-forwarding