将 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 中,这个措辞被修改了,但如果意思改变了我会感到惊讶。