跳转到内容

更多 C++ 惯用法/隐式转换

来自 Wikibooks,开放世界中的开放书籍

隐式转换

[编辑 | 编辑源代码]

注意
文章需要改进!

当某个类型 T1 的表达式用在不接受该类型但接受其他类型 T2 的上下文中时,就会执行隐式转换。

也称为

[编辑 | 编辑源代码]

在某些上下文中,可以使用与函数所需类型不完全相同的变量。特别是

  • 当表达式用作调用以 T2 作为参数声明的函数时的参数时;
  • 当表达式用作期望 T2 的运算符的操作数时;
  • 当初始化类型为 T2 的新对象时,包括在返回 T2 的函数中的 return 语句;
  • 当表达式用在 switch 语句中时(T2 为整型);
  • 当表达式用在 if 语句或循环中时(T2 为 bool)。

只有当从 T1 到 T2 存在一个明确的隐式转换序列时,程序才是格式良好的(可以编译)。

更多信息:C++ 参考 en.cppreference.com implicit_conversion

解决方案和示例代码

[编辑 | 编辑源代码]

指针到布尔的转换

int a = 42;
int* ptr = &a;
if (ptr) // checks if ptr is not null_ptr
   ...

std::string 到其他类型的转换

#include <string>

struct A {
    A( const std::string & s ) {}
};

void func( const A & a ) {
}

int main() {
    func( "one" );               // error - requires 2 steps to convert: const char* -> std::string -> A
    func( A("two") );            // ok - converting const char* -> std::string, which is used to create A
    func( std::string("three") );// ok - implicit conversion std::string -> A
}

示例来自这个 Stack Overflow 问题,标题为:C++ 隐式转换。

已知用途

[编辑 | 编辑源代码]

到处都是,一直都是,...

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
华夏公益教科书