显式类型转换

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue、右值 rvalue、亡值 xvalue)
求值顺序(序列点)
常量表达式
不求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=ba+=ba-=ba*=ba/=ba%=ba&=ba|=ba^=ba<<=ba>>=b
自增与自减++a--aa++a--
算术运算符+a-aa+ba-ba*ba/ba%b~aa&ba|ba^ba<<ba>>b
逻辑运算符a||ba&&b!a
比较运算符a==ba!=ba<ba>ba<=ba>=b
成员访问运算符a[b]*a&aa->ba.ba->*ba.*b
其他运算符a(...)a,ba?b:c
运算符的替代表示形式
优先级和结合性
折叠表达式(C++17)
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
运算符重载
类型转换
隐式转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)aT(a)
用户定义转换
 

用显式和隐式转换的组合在类型间转换。

目录

[编辑] 语法

( new_type ) expression (1)
new_type ( expression ) (2)
new_type ( expressions ) (3)
new_type ( ) (4)
new_type { expression-list(可选) } (5) (C++11 起)
template ( expressions(可选) ) (6) (C++17 起)
template { expressions(可选) } (7) (C++17 起)

返回 new_type 类型值。

[编辑] 解释

1) 遇到 C 风格转型表达式时,编译器试图将它转译成下列转型表达式,以此顺序:
a) const_cast<new_type>(expression);
b) static_cast<new_type>(expression) ,带扩展:到导出类的引用或指针额外允许转型成到无歧义基类的引用或指针(反之亦然),纵使基类不可访问(即此转型忽略 private 继承指定符)。同样适用于转型指向成员指针到指向无歧义非虚基类的成员指针;
c) static_cast (带扩展)后随 const_cast
d) reinterpret_cast<new_type>(expression)
e) reinterpret_cast 后随 const_cast
选择首个满足各自转型运算符要求的首选项,即使它无法编译(见示例)。若转型能转译成多于一种 static_cast 后随 const_cast 的方式,则它无法编译。
另外, C 风格转型记号允许在不完整类型的指针之间双向转型。若 expressionnew_type 是指向不完整类型的指针,则 static_cast 还是 reinterpret_cast 得到选择是未指定的。
2) 函数式转型表达式由一个简单类型指定符或 typedef 指定符(换言之,是单个词的类型名: unsigned int(expression)int*(expression) 非法),后随括号中的单个表达式。此转型表达式准确等价于对应的 C 风格转型表达式。
3) 若括号中有多于一个表达式,则 new_type 必须是有适合声明的构造函数的类。此表达式是 new_type 类型纯右值,其指代的临时量 (C++17 前)其结果对象 (C++17 起)expressions 直接初始化
4)new_type 指名一个非数组完整对象类型,则此表达式是 new_type 类型纯右值,指代该类型临时量 (C++17 前)其结果对象(可以有 cv 限定)为该类型 (C++17 起)。若 new_type 是对象类型,则对象被值初始化。若 new_type 是(可有 cv 限定的) void ,则表达式是 void 纯右值而无结果对象 (C++17 起)
5) 单个词的类型名后随花括号初始化器列表,是指定类型的纯右值,其指代的临时量 (C++17 前)其结果对象 (C++17 起)以指定的花括号初始化器列表直接列表初始化。这是仅有的能创建数组纯右值的表达式。
6,7)(2-5) ,除了首先进行类模板实参推导

同所有转型表达式,结果是:

  • 左值,若 new_type 是左值引用或到函数类型的右值引用;
  • 亡值,若 new_type 是到对象类型的右值引用;
  • 否则为纯右值。

[编辑] 示例

double f = 3.14;
unsigned int n1 = (unsigned int)f; // C 风格转型
unsigned int n2 = unsigned(f);     // 函数式转型
 
class C1;
class C2;
C2* foo(C1* p)
{
    return (C2*)p; // 转型不完整类型到不完整类型
}
 
// 此示例中, C 风格转型被转译成 static_cast
// 尽管它也能作为 reinterpret_cast 工作
struct A {};
struct I1 : A {};
struct I2 : A {};
struct D : I1, I2 {};
 
int main()
{
    D* d = nullptr;
//  A* a = (A*)d;                   // 编译时错误
    A* a = reinterpret_cast<A*>(d); // 这能编译
}


[编辑] 引用

  • C++11 standard (ISO/IEC 14882:2011):
  • 5.2.3 Explicit type conversion (functional notation) [expr.type.conv]
  • 5.4 Explicit type conversion (cast notation) [expr.cast]
  • C++98 standard (ISO/IEC 14882:1998):
  • 5.2.3 Explicit type conversion (functional notation) [expr.type.conv]
  • 5.4 Explicit type conversion (cast notation) [expr.cast]

[编辑] 参阅

const_cast 转换 添加或移除 const[编辑]
static_cast 转换 进行基本转换[编辑]
dynamic_cast 转换 进行有检查的多态转换[编辑]
reinterpret_cast 转换 进行通用低层转换[编辑]
标准转换 从一个类型到另一类型的隐式转换[编辑]
转型运算符C 文档