构造后 const char* returns 的值为空

Value of const char* returns empty after construction

将此 Vector3 转换为 const char* 在隐式和显式转换中有效,但在构造时尝试转换时无效。只有这样 const char* 'v3pchar' return 才会空白。有什么想法吗?完整代码如下。谢谢!

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

struct Vector3 {
    int x, y, z = 0;

    Vector3() {
        cout << "Vector3()" << endl;
    };
    
    Vector3(int X, int Y, int Z) : x(X), y(Y), z(Z) {
        cout << "Vector3(int X, int Y, int Z)" << endl;
    };

    // Focal point here
    operator const char* () {
        cout << "operator const char* called" << endl;
        v3string = to_string(x) + ", " + to_string(y) + ", " + to_string(z);
        v3pchar = v3string.c_str();
        return v3pchar;
    }

private:
    string v3string = "Never even blank";
    const char* v3pchar = "So why does this become blank?";
};

int main() {
    Vector3 v1 = Vector3(1, 2, 3);
    cout << "Vector3 implicit cast to char*: [" << v1 << "]" << endl; // Works

    const char* v2 = v1;
    printf("Vector3 explicit cast to char*: [%s]\n", (const char*)v2); // Works

    cout << "---------------------------------------------" << endl;

    const char* v3 = Vector3(4, 5, 6);
    cout << "Vector3 instantiation cast to char*: [" << v3 << "]" << endl; // Empty

    return 0;
};
   v3pchar = v3string.c_str();

c_str() 返回的 const char * 指针由其 std::string 拥有,并且仅在 std::string 被修改或被销毁之前有效,以发生者为准第一的。胶囊摘要:一旦v3string被修改或销毁,v3pchar就不再有效。

   const char* v3 = Vector3(4, 5, 6);

这会导致以下事件序列:

  1. 一个临时 Vector3 对象被创建和构造。
  2. 它的 operator const char* 方法被调用,它 returns 一个 const char * 由内部 std::string 拥有,它是 Vector3 对象的成员。
  3. 返回的const char *赋值给v3.
  4. 临时 Vector3 对象及其 std::string 成员被销毁。
  5. 它遵循最初返回的 const char * 指针不再有效,因为拥有它的 std::string 对象现在已被销毁。

const char * 指针的任何后续使用都会导致未定义的行为。

应该可以修改显示的代码,使用现代 C++ 中的一些功能,这些功能会导致此构造变得格式错误(class 方法引用限定符),并让您的 C++ 编译器捕获此常见问题漏洞。但那将是另一个问题;至于您观察到的结果的原因:由于上述原因,它是未定义的行为。