对不起,如果这是一个非常菜鸟的问题。我需要知道 C++ 是否已经支持以下行为:
void sampleFunc(std::string const& p_sVal){
Log("this is your string: " + p_sVal);
}
int main(){
sampleFunc("my string"); //does the param allocates a copy of "my string"...?
}
参数 std::string const& p_sVal
是否分配了传递的 const char*
的副本,或者编译器足够聪明,知道传递的是 const char*
并且可以优化它不需要分配和复制?
如果没有,您能否建议实现此目的的示例代码? (注意:除了 string_view
解决方案。)
答案 0 :(得分:2)
根据您传递给它的字符串文字构造临时 std::string
,供 std::string const&
参数引用。
正如评论中所建议的,std::string
拥有它的存储空间(否则它将是 std::string_view
,不是吗?)。在我看来,仅此观察并不能真正告诉您临时std::string
将不能从传递的参数中窃取资源。
资源仍然可以移动,因为您将右值传递给 sampleFun
,对吗?不,错了,因为正如您所看到的 here,文字字符串,例如 "my string"
中的 main
,是左值,而不是右值。
哦,即使字符串文字是右值,从 std::string
's (well, std::basic_string
's) constructor 上的文档中您会看到,除了“移动构造函数”(即移动版本)之外,没有其他构造函数采用 &&
复制构造函数,即采用与其正在构造的相同类型的构造函数,即 std::string
,而不是 const char*
)。
请注意,由于您正在执行 "this is your string: " + p_sVal
,您确实希望在某个时刻构造一个 std::string
,因为您需要 std::operator+
才能工作。您可以让 sampleFunc
接受 const char*
,但是您必须将 p_sVal
或字符串文字包装在 std::string{…}
中才能使 +
工作。>