C++ 为什么我可以通过“a”;“C字符串”;对于一个需要std::string的函数,它可以工作吗?

C++ 为什么我可以通过“a”;“C字符串”;对于一个需要std::string的函数,它可以工作吗?,c++,type-conversion,C++,Type Conversion,我有一个方法: void Foo::Bar(const std::string &str) { printf("%d", str.length()); } 当我这样做的时候,它可以无缝地工作 foo.Bar("hello"); 我认为 > hello > >不是 STD::String < P>因为STD:String有一个构造函数,它使用了 const char */Cuff>,C++将自动为您构造一个临时字符串对象。 ,因为STD::String有一个构造函数,它使用

我有一个方法:

void Foo::Bar(const std::string &str)
{
    printf("%d", str.length());
}
当我这样做的时候,它可以无缝地工作

foo.Bar("hello");

我认为 > hello > >不是<代码> STD::String

< P>因为STD:String有一个构造函数,它使用了 const char */Cuff>,C++将自动为您构造一个临时字符串对象。

,因为STD::String有一个构造函数,它使用了<代码> const char */Cuth>C++将自动为您构造一个临时字符串对象。

> P>技术上,它是一个代码> char const(6)< /Cord>。但是,是的,您应该能够做到这一点,这是因为隐式转换和一个<代码> STD::String < /Calp>构造函数。

< P>技术上,它是<代码> char const(6)。但是,是的,由于隐式转换和一个
std::string
构造函数,您应该能够做到这一点。

因为有一个?隐式?使用
std::string(char*)
构造函数从
char*
转换为
std::string

因为有一个隐式?使用
std::string(char*)
构造函数将
char*
转换为
std::string

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

  • 使用转换构造函数(例如“std::string::string(const char*c_string)”)
  • 使用转换运算符(例如“OldType::operator NewType()const”)

  • 任何接受单个参数且不使用关键字“explicit”的构造函数都定义了隐式转换(从参数类型到正在构造的对象类型)。标准字符串类故意不使用“explicit”来提供这种转换的便利。

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

  • 使用转换构造函数(例如“std::string::string(const char*c_string)”)
  • 使用转换运算符(例如“OldType::operator NewType()const”)

  • 任何接受单个参数且不使用关键字“explicit”的构造函数都定义了隐式转换(从参数类型到正在构造的对象类型)。标准字符串类故意不使用“显式”来提供转换的便利性。

    与您的问题有点关系:如果C++中有一段时间,您不明确地要求编译器为您更改类型,那么当兼容构造函数存在时,使用关键字“显式”。在构造函数之前。然后它会给你一个编译器错误。但是,您只能对创建的类型执行此操作。与String类型无关。

    与您的问题有一定关系:如果C++中有一段时间,您不明确地希望编译器为您更改类型,那么当兼容构造函数存在时,在构造函数之前使用关键字“显式”。然后它会给你一个编译器错误。但是,您只能对创建的类型执行此操作。不适用于字符串等STL类型。

    您的字符串文本是一个
    字符常量[6]

    它的名称衰减为
    const char*
    ,以传递给函数

    然后执行隐式转换,因为:

    • 该函数接受对常量的引用,这意味着可以将
      rvalue
      绑定到它
    • const char*
      可以隐式转换为
      std::string
      rvalue

    您的字符串文本是一个
    字符常量[6]

    它的名称衰减为
    const char*
    ,以传递给函数

    然后执行隐式转换,因为:

    • 该函数接受对常量的引用,这意味着可以将
      rvalue
      绑定到它
    • const char*
      可以隐式转换为
      std::string
      rvalue
    重要的是,非显式构造函数。重要的是,非显式构造函数。