为什么我可以将"C字符串"传递给期望std :: string的函数并且它有效?

J C*_*per 1 c++ type-conversion

我有一个方法:

void Foo::Bar(const std::string &str)
{
    printf("%d", str.length());
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它可以无缝地工作

foo.Bar("hello");
Run Code Online (Sandbox Code Playgroud)

我以为"hello"const char *,不是std::string

Mic*_*yan 8

可以通过两种方式隐式转换用户定义的类型:

  1. 使用转换构造函数(例如"std :: string :: string(const char*c_string)").
  2. 使用转换运算符(例如"OldType :: operator NewType()const").

任何采用单个参数但不使用关键字"explicit"的构造函数都定义了隐式转换(从参数类型到正在构造的对象的类型).标准字符串类故意不使用"显式"以便提供此转换的便利.


Mar*_*som 7

因为std :: string有一个构造函数const char *,所以C++会自动为你构造一个临时的字符串对象.

  • 重要的是,_non-explicit_构造函数. (7认同)

AJG*_*G85 6

从技术上讲,这是一个char const[6]但是你应该能够做到这一点,这要归功于隐式转换和std::string构造函数之一.