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

In C++, can we use { } for C-Style casting?

在阅读有关数据类型转换的内容时,我看到了这个示例:

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

我知道我们可以使用:

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

我的问题:

Q1:int{c} 是另一种转换数据类型的方法吗?

Q2:在网上查了一下,我知道C++的casting是不一样的,它让编译器在编译时检查casting的可能性,但是1和2有什么区别?如果只是另一种施法方式,int{c} 有何不同?

Q3: 有没有其他方式显式convert/cast?

Q1:是的。它几乎与函数式样式转换 (int(c)) 相同,并且由于 c++11 的 uniform initialization 而起作用。然而大括号初始化确实有一些注意事项,例如缩小转换(如 long l = 5; char c{l};)将产生警告。

Q2: 1 和 2 是等价的,尽管在某些情况下一个有效而另一个无效。

// long long(c); // Breaks unless you make a typedef for 'long long'
(long long)c;    // Works fine

template <class In, class Out>
Out convert(const In& in) {
    // return (Out)in; // Only works if 'In' is a primitive type
    return Out(in);    // Works regardless of the type of 'In' (assuming an appropriate constructor exists)
}

Q3:您提到的唯一一个 C++ 风格转换的例子是 static_cast。还有其他 C++ 转换:

  • dynamic_cast
  • reinterpret_cast
  • const_cast

int(c) is the the C++ version of the C-style cast (int)c. It first attempts a const_cast<int>(c), then (failing that) a static_cast<int>(c) followed by reinterpret_cast.

int{c} 是一个稍微不同的鱼缸。严格来说,这是列表初始化并且有更严格的规则。特别是不允许缩小转换,即

int x;
char s{x};  // error

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

对于内置类型以外的类型,除了上述类型转换之外,还有dynamic_cast

Is int{c} another way of casting data types?

是的。 T{value} 创建一个 T 类型的临时文件,即 direct-list-initialized 和指定的 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;
}

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

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

After some research on the net, I know that C++ casting is different and it have the compiler check the casting possibility at the compile time, but what are the differences between 1 and 2?

T(value)(T)value最大的区别在于T(value)中,T必须是一个单词。例如

int main() {
    unsigned int(10000000); // error
    (unsigned int)10000000; // compiles
}

Q3: Are there any other ways to explicitly convert/cast?

嗯,在 C++ 中,他们希望您使用 static_castreinterpret_castdynamic_castconst_cast 的 C++ 强制转换。这些优于 c 样式转换,因为 c 样式转换将执行所有 C++ 版本具有某些限制并具有某些保证的操作。