构造后 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);
这会导致以下事件序列:
- 一个临时
Vector3
对象被创建和构造。
- 它的
operator const char*
方法被调用,它 returns 一个 const char *
由内部 std::string
拥有,它是 Vector3
对象的成员。
- 返回的
const char *
赋值给v3
.
- 临时
Vector3
对象及其 std::string
成员被销毁。
- 它遵循最初返回的
const char *
指针不再有效,因为拥有它的 std::string
对象现在已被销毁。
此 const char *
指针的任何后续使用都会导致未定义的行为。
应该可以修改显示的代码,使用现代 C++ 中的一些功能,这些功能会导致此构造变得格式错误(class 方法引用限定符),并让您的 C++ 编译器捕获此常见问题漏洞。但那将是另一个问题;至于您观察到的结果的原因:由于上述原因,它是未定义的行为。
将此 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);
这会导致以下事件序列:
- 一个临时
Vector3
对象被创建和构造。 - 它的
operator const char*
方法被调用,它 returns 一个const char *
由内部std::string
拥有,它是Vector3
对象的成员。 - 返回的
const char *
赋值给v3
. - 临时
Vector3
对象及其std::string
成员被销毁。 - 它遵循最初返回的
const char *
指针不再有效,因为拥有它的std::string
对象现在已被销毁。
此 const char *
指针的任何后续使用都会导致未定义的行为。
应该可以修改显示的代码,使用现代 C++ 中的一些功能,这些功能会导致此构造变得格式错误(class 方法引用限定符),并让您的 C++ 编译器捕获此常见问题漏洞。但那将是另一个问题;至于您观察到的结果的原因:由于上述原因,它是未定义的行为。