在 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';
}
我知道我们可以使用:
int(c)
(int) c
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_cast
、reinterpret_cast
、dynamic_cast
和 const_cast
的 C++ 强制转换。这些优于 c 样式转换,因为 c 样式转换将执行所有 C++ 版本具有某些限制并具有某些保证的操作。
在阅读有关数据类型转换的内容时,我看到了这个示例:
void intval()
{
for (char c; cin >> c; )
cout << "the value of '" << c << "' is " << int{c} << '\n';
}
我知道我们可以使用:
int(c)
(int) c
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_cast
、reinterpret_cast
、dynamic_cast
和 const_cast
的 C++ 强制转换。这些优于 c 样式转换,因为 c 样式转换将执行所有 C++ 版本具有某些限制并具有某些保证的操作。