explicit type conversion

来自cppreference.com
< cpp‎ | language

 
 
C++语言
表达式
替代表示
字面量
布尔型 - 整型 - 浮点型
字符型 - 字符串 - nullptr (C++11)
用户定义 (C++11)
Utilities
属性 (C++11)
Types
typedef声明
类型别名声明 (C++11)
Casts
隐式类型转换 - 显示类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
explicit (C++11)
static
静态成员函数
模板
杂项
 
之间转换使用相结合的显式和隐式转换的类型.
原文:
Converts between types using a combination of explicit and implicit conversions.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 语法

( new_type ) expression (1)
new_type ( expression ) (2)
返回值类型new_type
原文:
Returns a value of type new_type.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 解释

1)
当C风格的转换表达时,编译器会尝试以下CAST表达式,顺序如下:
原文:
When the C-style cast expression is encountered, the compiler attempts the following cast expressions, in this order:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
a) const_cast<new_type>(expression)
b)
static_cast<new_type>(expression),扩展名:到派生类指针或引用另外允许将其转换为明确的基类的指针或引用(反之亦然),即使无法访问基类(也就是,这个演员忽略了私有继承规范) 。同样适用于铸造成员无二非虚基类成员的指针的指针
原文:
static_cast<new_type>(expression), with extensions: pointer or reference to a derived class is additionally allowed to be cast to pointer or reference to unambiguous base class (and vice versa) even if the base class is inaccessible (that is, this cast ignores the private inheritance specifier). Same applies to casting pointer to member to pointer to member of unambigous non-virtual base
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
c)
static_cast(扩展名),其次const_cast
原文:
static_cast (with extensions) followed by const_cast
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
d) reinterpret_cast<new_type>(expression)
e)
reinterpret_cast其次是const_cast
原文:
reinterpret_cast followed by const_cast
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
@ @的第一选择满足要求的各自的类型转换操作符被选择时,即使它不能被编译(参见实施例).
原文:
@@ The first choice that satisfies the requirements of the respective cast operator is selected, even if it cannot be compiled (see example).
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
@ @此外,C-风格的转换符号允许投,之间,以及不完整的类类型的指针。如果expressionnew_type是不完整的类类型的指针,它指定是否被选中的static_cast和reinterpret_cast的.
原文:
@@ In addition, C-style cast notation is allowed to cast from, to, and between pointers to incomplete class type. If both expression and new_type are pointers to incomplete class types, it's unspecified whether static_cast or reinterpret_cast gets selected.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
2)
功能转换由一个简单的类型说明符或typedef说明符(换句话说,单个单词的类型名称:unsigned int(expression)int*(expression)无效),然后由一个单一的括号中的表达式。这个转换是完全等同于相应的C风格的转换表达.
原文:
The functional cast consists of a simple type specifier or a typedef specifier (in other words, a single-word type name: unsigned int(expression) or int*(expression) are not valid), followed by a single expression in parentheses. This cast is exactly equivalent to the corresponding C-style cast expression.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
与所有的强制转换表达式,其结果是:
原文:
As with all cast expressions, the result is:
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 如果一个左值new_type是一个左值引用类型或一个右值引用为函数类型
    原文:
    an lvalue if new_type is an lvalue reference type or an rvalue reference to function type;
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 值为xValue,如果new_type是一个右值引用的对象类型
    原文:
    an xvalue if new_type is an rvalue reference to object type;
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
  • 一个prvalue否则.
    原文:
    a prvalue otherwise.
    这段文字是通过 Google Translate 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 示例

double f = 3.14;
unsigned int n1 = (unsigned int)f; // C-style cast
unsigned int n2 = unsigned(f);     // functional cast
 
class C1;
class C2;
C2* foo(C1* p)
{
    return (C2*)p; // casts incomplete type to incomplete type
}
 
// In this example, C-style cast is interpreted as static_cast
// even though it would work as reinterpret_cast
struct A {};
struct I1 : A {};
struct I2 : A {};
struct D : I1, I2 {};
 
int main()
{
   D* d = nullptr;
   A* a = (A*)d;                   // compile-time error
   A* a = reinterpret_cast<A*>(d); // this compiles
}