声明具有两种类型的变量:"int char"
Declaring a variable with two types: "int char"
我是一个C++初学者,我正在阅读Bjarne Stroustrup的编程:使用C++的原则和实践。
在关于 3.9.2 不安全转换的部分中,作者提到
当初始值设定项是整数文本时,编译器可以检查实际值并接受不意味着缩小范围的值:
int char b1 {1000}; // error: narrowing (assuming 8-bit chars)
我对这个声明感到困惑。它使用两种类型(int
和char
(。我以前从未在 Java 和 Swift(我相对熟悉的两种语言(中看到过这样的声明。这是拼写错误还是有效的C++语法?
这是书中的一个错误。这不是一个有效的C++声明,即使没有所谓的缩小转换范围。
不过,在Bjarne Stroustrup页面上的任何勘误表中都没有提到它(第4次印刷及更早(,这很奇怪。这是一个足够明显的错误。我想既然它被评论了//error
很少有人注意到声明本身的错误。
这本书错了。
令牌序列int char b1{1000};
在语义上无效C++。
您正在尝试使用多个类型声明b1
,这毫无意义。
这是错误的。 在 C/C++ 中,多类型声明可以通过使用联合来实现。例如:
union {
int i;
char c;
} var;
var.i = 42;
/* OR */
var.c = ‘c’;
存储是相同的,因此 .c 和 .i 只是相同值的每个类型句柄。
这在 C/C++ 语法中是错误的。除了union
s(请参阅@Alex答案(之外,还有一种C++方法可以仅存储一种称为std::variant
(类型安全联合(的可用类型:
#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
}
相关文章:
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 声明具有两种类型的变量:"int char"
- 定义.cpp中常数int/char*
- Qt5 对'QApplication::QApplication(int&, char**, int)'的未定义引用
- 将int/char插入数据库
- 从 std::vector 转换为<int> char[] C++
- 为什么INT(char)的比较不起作用
- 使用int+char组合uint8_t
- 为什么这个返回值?C++int/char混淆
- 向量到 int<char> 与向量<wchar_t>到 int
- Evaluate an int, char and int
- 接收错误"no matching function for call to 'getline(std::ifstream&, int&, char)'"
- reinterpret_cast<int*>(char*) vs. static_cast<int*>(static_cast<void*>(char*)) --
- 将类型int(C::*)(int, char)转换为类型int(int, char)
- 如何添加多位数的int和char,其中输出为int+char
- 是int, char也是抽象数据类型