C++:将字符串文字或变量传递给函数
C++: Pass string literal or variable to function
我有一个将字符串作为输入的函数 f
。我通常想提供一个字符串文字,例如 f("hello")
。但是,我想实现另一个基于 f
:
的函数 g
std::string f(const std::string&& x) {
return x + " world";
}
std::string g(const std::string&& x) {
std::string res = f(x); // problem: rvalue reference to std::string cannot bind to lvalue of type std::string
res += "!";
return res;
}
int main() {
std::string res_a = f("hello");
std::string res_b = g("world");
return 0;
}
我如何在 C++11/14 中以一种可以将 f
用于字符串文字和变量的方式实现这一点?
解决函数同时使用 l-value 和 r-value 引用问题的通用方法是使用模板化函数,如 so-
template <typename T>
T f(T&& val) {
}
template <typename T>
T g(T&& val) {
T some_val = f(std::forward<T>(val));
}
std::foward<T>(val)
将 l-value 作为 l-value 转发,将 r-value 作为 r-value 转发,正如其名称所暗示的那样。
通过模板化函数,您可以确保此逻辑适用于任何类型,而不仅仅是字符串。
获取read-only参数的传统方式是通过const
lvalue引用。
std::string f(const std::string& x)
这条经验法则适用于许多类型,而不仅仅是 std::string
。主要的例外是不大于指针的类型(例如 char
)。
一个函数有一个 const
右值引用是很不寻常的。正如您所发现的,这会在尝试将变量作为参数传递时增加难度。非 const
右值引用具有值,但 const
右值引用在大多数情况下不如 const
左值引用。另见 Do rvalue references to const have any use?
我有一个将字符串作为输入的函数 f
。我通常想提供一个字符串文字,例如 f("hello")
。但是,我想实现另一个基于 f
:
g
std::string f(const std::string&& x) {
return x + " world";
}
std::string g(const std::string&& x) {
std::string res = f(x); // problem: rvalue reference to std::string cannot bind to lvalue of type std::string
res += "!";
return res;
}
int main() {
std::string res_a = f("hello");
std::string res_b = g("world");
return 0;
}
我如何在 C++11/14 中以一种可以将 f
用于字符串文字和变量的方式实现这一点?
解决函数同时使用 l-value 和 r-value 引用问题的通用方法是使用模板化函数,如 so-
template <typename T>
T f(T&& val) {
}
template <typename T>
T g(T&& val) {
T some_val = f(std::forward<T>(val));
}
std::foward<T>(val)
将 l-value 作为 l-value 转发,将 r-value 作为 r-value 转发,正如其名称所暗示的那样。
通过模板化函数,您可以确保此逻辑适用于任何类型,而不仅仅是字符串。
获取read-only参数的传统方式是通过const
lvalue引用。
std::string f(const std::string& x)
这条经验法则适用于许多类型,而不仅仅是 std::string
。主要的例外是不大于指针的类型(例如 char
)。
一个函数有一个 const
右值引用是很不寻常的。正如您所发现的,这会在尝试将变量作为参数传递时增加难度。非 const
右值引用具有值,但 const
右值引用在大多数情况下不如 const
左值引用。另见 Do rvalue references to const have any use?