c++ - 声明具有两种类型的变量的C++: int字符"

  显示原文与译文双语对照的内容
70 0

我是一个 C++ 初学者,我正在阅读stroustrup的 Bjarne程序:使用 C++的原理和实践。

3.9.2 不安全转换的部分中,作者提到

初始值设定项时,编译器可以检查实际值,并接受不表示收缩的值:

int char b1 {1000};//error: narrowing (assuming 8-bit chars)

我对这个声明感到困惑。它使用两种类型的( intchar ) 。在( 我比较熟悉这两种语言) 之前,我从没见过这样的声明,。这是错误的还是有效的C++ 语法?

时间:原作者:0个回答

119 0

这是本书中的错误。这不是一个有效的C++ 声明,即使没有假定的收缩转换也是如此。

但是,在 ( 4th 打印和更早版本)的 Bjarne页面中没有提到它,它是奇怪的。这是个很清楚的错误。我想因为它被注释为 //error,很少有人注意到声明本身的错误。

原作者:
129 3

这本书错了。

标记序列 int char b1{1000}; 在语义上不是有效的C++ 。

你试图声明具有多个类型的b1,这没有意义。

原作者:
71 0

在 C/C++ 中,多重类型声明可以通过使用联合来实现。比如:

union {
 int i;
 char c;
} var;
var.i = 42;
/* OR */
var.c = ‘c’;

存储是相同的,因此. c 和. i 只是每个句柄的类型的类型。

原作者:
129 2

在 C/C++ 语法中这是错误的。在 addiction union ( 请参见 @Alex 应答) 中,只有一种方法可以存储名为 std::variant ( 类型安全联合)的aviable类型之一:

#include <variant>
#include <string>
int main()
{
 std::variant<int, float> v, w;
 v = 12;//v contains int
 int i = std::get<int>(v);
 w = std::get<int>(v);
 w = std::get<0>(v);//same effect as the previous line
 w = v;//same effect as the previous line
//std::get<double>(v);//error: no double in [int, float]
//std::get<3>(v);//error: valid index values are 0 and 1
 try {
 std::get<float>(w);//w contains int, not float: will throw
 }
 catch (std::bad_variant_access&) {}
 std::variant<std::string> v("abc");//converting constructors work when unambiguous
 v ="def";//converting assignment also works when unambiguous
}
原作者:
...