在C++中,我们可以使用{}进行C风格的转换吗?

Sha*_*adi 7 c++ casting type-conversion explicit-conversion

虽然我一直在阅读有关数据类型转换的内容,但我看到了这个例子:

void intval()
{
    for (char c; cin >> c; )
    cout << "the value of '" << c << "' is " << int{c} << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我知道我们可以使用:

  1. int(c)
  2. (int) c
  3. static_cast<int>(c)

我的问题:

Q1:是int{c}另一种投射数据类型的方式吗?

Q2:在对网络进行一些研究之后,我知道C++转换是不同的,它有编译器在编译时检查转换的可能性,但是1和2之间有什么区别?int{c}如果它只是另一种铸造方式又有何不同?

问题3:有没有其他方法可以显式转换/转换?

Nat*_*ica 8

int{c}另一种投射数据类型的方法吗?

是. T{value}创建一个临时类型T,使用指定的braced-init-list进行直接列表初始化.此转换具有优势,可用于创建临时数组.这样就可以了T(value)T{value}

int main() {
    using int_array = int[5];
    for( auto e : int_array{1,2,3,4,5})
        std::cout << e;
}
Run Code Online (Sandbox Code Playgroud)

它还附带一个警告,即缩小转换是一个错误

int main() {
    int(10000000000ll);  // warning only, still compiles
    int{10000000000ll};  // hard error mandated by the standard
}
Run Code Online (Sandbox Code Playgroud)

在对网络进行一些研究之后,我知道C++转换是不同的,它有编译器在编译时检查转换的可能性,但是1和2之间有什么区别?

之间最大的区别T(value),并(T)value是在T(value),T必须是单个字.例如

int main() {
    unsigned int(10000000); // error
    (unsigned int)10000000; // compiles
}
Run Code Online (Sandbox Code Playgroud)

问题3:有没有其他方法可以显式转换/转换?

井C++他们希望你使用C++蒙上它们是static_cast,reinterpret_cast,dynamic_cast,和const_cast.那些比c风格的演员更受欢迎,因为ac风格演员将完成C++版本具有某些限制并具有某些保证的所有那些.


Wal*_*ter 6

int(c)是C风格演员的C++版本(int)c.它首先尝试a const_cast<int>(c),然后(失败)a static_cast<int>(c)后跟reinterpret_cast.

int{c}是一种略有不同的鱼类.严格来说,这是列表初始化并且具有更严格的规则.特别是,不允许缩小转换,即

int x;
char s{x};  // error
Run Code Online (Sandbox Code Playgroud)

因此,除非您知道缩小转换是可接受的,否则建议使用此(而不是强制转换).

对于除内置类型之外的其他类型,除了上面提到的类型之外,还有dynamic_cast.