【问题标题】:What happens when converting char * to string *?将 char * 转换为 string * 时会发生什么?
【发布时间】:2021-05-07 16:59:24
【问题描述】:
char * ss = "abscd";
string * b = (string *) ss;
std::cout << ss << std::endl;
std::cout << *b << std::endl;

输出是:

abscd
//empty line

我以为会是:

abscd
abscd

【问题讨论】:

  • 这是未定义的行为,因为 std::stringchar * 是不相关的类型。
  • 你可以构造一个像std::string b{ss};这样的字符串,但是你不应该cast一个char*到一个string*,因为它们是完全不相关的类型
  • C++ static_cast 会在编译时报错。 godbolt.org/z/c95xq8
  • (string *) 是一个 c 风格的演员表。如果您通常避免这些,通常会大大提高代码质量。
  • 也可以看看std::string_view

标签: c++ string pointers


【解决方案1】:

你一定是误会了什么。首先,您在这里错过了const

const char * ss = "abscd";

接下来,std::string 用于替换 c 字符串,就像您使用 ss 所拥有的那样。但是,std::string 是一个字符串,而std::string* 是一个指向字符串的指针。由于就指针之间的转换而言,std::stringchar 无关,因此您的代码具有未定义的行为。

要从 c 字符串创建 std::string,请使用其构造函数,例如:

std::string b{ss};

最后但同样重要的是,避免像 string * b = (string *) ss; 这样的 c 风格转换。您可以将任何内容强制转换为任何内容而不会出现编译器错误,但这并不意味着它是正确的。

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2012-09-10
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多