【发布时间】:2018-08-13 14:43:18
【问题描述】:
假设我想将右值和左值都传递给我的函数,但我不想编写所有 O(2n) 函数签名,其中 n 是参数的数量。例如,对于我的字符串附加函数:
inline static String append(String&& l1, String&& l2) {
l1.append(l2);
return l1;
}
inline static String append(String&& l1, String& l2) {
l1.append(std::forward<String>(l2));
return l1;
}
inline static String append(String& l1, String&& l2) {
l1.append(l2);
return l1;
}
inline static String append(String &l1, String& l2) {
return append(std::forward<String>(l1), std::forward<String>(l2));
}
函数签名太多了! TMP 是图灵完备的语言,必须有一种方法可以在编译时生成同一事物的所有 4 个版本,并且正确使用 std::forward 对吗? C++17 魔术加分。
【问题讨论】:
-
你在这里误用了
forward。 -
更具体地说,在您的情况下,它充当
std::move。它旨在与通用引用一起使用... -
std::forward 不是 std::move 还是 no-op 吗?我怎么会误用它?
-
是的。但是由于您不使用通用引用,因此在您的情况下它总是会移动。