【发布时间】:2018-12-13 01:31:12
【问题描述】:
我读了很多关于它的内容,但仍然无法理解。这两种变体有什么区别:
template <typename val_t>
class fact_t: public exp_t<val_t> {
val_t m_value;
public:
fact_t(val_t &&value) : m_value{std::forward<val_t>(value)} {}
};
template <typename val_t>
class fact_t: public exp_t<val_t> {
val_t m_value;
public:
fact_t(val_t &&value) : m_value{std::move(value)} {}
};
当一个变体失败但另一个变体仍然可以工作时,有人可以举一个例子吗?
我尝试使用第一种变体:
std::string str = "str";
fact_t<std::string> f(str);
但是会导致编译时出错。虽然我从其他主题和 cppreference 了解到 str 是 lvalue 并且 std::forward 允许使用它。我错过了哪里?
P.S.很抱歉,如果这是一个愚蠢的问题,但我真的无法理解。
【问题讨论】:
-
@KerrekSB 我也读过这个话题
-
@KerrekSB,但是当我尝试编写类似
std::string x = "str"; fact_t<std::string> f(x);的内容时,两种变体都失败了。虽然据我了解它是 lvalue 并且必须与forward一起使用。怎么了? -
@Jans 我已经读过这个话题了。我已经用更多细节更新了我的问题。