将 std::string 的 c_str() 结果分配给标准保证安全的相同 std::string?
Assigning a std::string's c_str() result to that same std::string guaranteed safe by the standard?
关于 std::string
,标准是否保证以下代码安全?
#include <string>
#include <cstdio>
int main()
{
std::string strCool = "My cool string!";
const char *pszCool = strCool.c_str();
strCool = pszCool;
printf( "Result: %s", strCool.c_str() );
}
我看到的声明表明 c_str
的结果只能保证在对同一 std::string
进行另一个方法调用之前可以安全使用,但我不清楚它是否安全是否将 const char *
传回赋值方法。
在使用真实世界的编译器(GCC、Clang 和 MSVC 的最新版本)进行测试时,它们似乎都支持这种行为。
此外,编译器还支持将字符串的后缀分配回自身,例如strCool = pszCool + 3
在这个例子中;结果将是该字符串与传递给它的值相同。
这种行为是否以某种方式得到保证,或者我只是幸运,我测试过的编译器提供的标准库支持这种情况?
在 C++17 中,这被指定为:
basic_string& operator=(const charT* s);
Returns: *this = basic_string(s)
.
备注:使用traits::length()
.
此操作顺序保证在原始存储被销毁之前制作副本。虽然不需要标准库来使用这个确切的操作序列来实现此调用,但它需要具有与所述相同的行为。
在 C++20 中,这个措辞被修改了,但如果意思改变了我会感到惊讶。
关于 std::string
,标准是否保证以下代码安全?
#include <string>
#include <cstdio>
int main()
{
std::string strCool = "My cool string!";
const char *pszCool = strCool.c_str();
strCool = pszCool;
printf( "Result: %s", strCool.c_str() );
}
我看到的声明表明 c_str
的结果只能保证在对同一 std::string
进行另一个方法调用之前可以安全使用,但我不清楚它是否安全是否将 const char *
传回赋值方法。
在使用真实世界的编译器(GCC、Clang 和 MSVC 的最新版本)进行测试时,它们似乎都支持这种行为。
此外,编译器还支持将字符串的后缀分配回自身,例如strCool = pszCool + 3
在这个例子中;结果将是该字符串与传递给它的值相同。
这种行为是否以某种方式得到保证,或者我只是幸运,我测试过的编译器提供的标准库支持这种情况?
在 C++17 中,这被指定为:
basic_string& operator=(const charT* s);
Returns: *this = basic_string(s)
.
备注:使用traits::length()
.
此操作顺序保证在原始存储被销毁之前制作副本。虽然不需要标准库来使用这个确切的操作序列来实现此调用,但它需要具有与所述相同的行为。
在 C++20 中,这个措辞被修改了,但如果意思改变了我会感到惊讶。