【C++ 小问答】5:对结构体成员字符数组的访问

问 1struct Book { 2 char name[10]; 3 char type[10]; 4 int price; 5}; 6 7struct Book *getBook() 8{ 9 struct Book b = { 10 .name = "C Primer", 11 .type = "Programme", 12 .price = 100, 13 }; 14 return &b; 15}; 16 17int main() 18{ 19 struct Book *b = getBook(); 20 char *name = b->name; 21 char *type = …

【C++ 小问答】4:数值运算中的小类型隐式转换

问 如下哪段代码有整数溢出: 1int Func(short a, short b) 2{ 3 return (a + b); 4} 1int Func(signed char a, signed char b) 2{ 3 return (a + b); 4} 1long long int Func(int a, int b) 2{ 3 return (a + b); 4} 1long long int Func(int a, int b) 2{ 3 return ((long long int)a + b); 4} 答 导致整数溢出最常见的场景,是在数值计算中没有对较小类型的操作数做恰当的类型转换1。而上述的前三段代码看起来都涉及 …

【C++ 小问答】3:未定义的 `Constexpr` 函数

问 下面哪些在编译期报错(非链接期): 1constexpr int GetVal(); 2constexpr int GetVal() { return 0; } 3constexpr int i = GetVal(); 1constexpr int GetVal(); 2constexpr int i = GetVal(); 1constexpr int GetVal(); 2int i = GetVal(); 1constexpr int GetVal(); 2constexpr int i = GetVal(); 3constexpr int GetVal() { return 0; } 答 将这几段代码分别用 g++ -c …

【C++ 小问答】2:平台对隐式类型转换的影响

问 一个经典问题: 1unsigned int a = ...; 2long b = ...; 3auto c = a + b; // 此处 auto 会推导出什么类型? 答 写了段粗糙的测试代码: 1#include <iostream> 2#include <typeinfo> 3 4int main() 5{ 6 unsigned int var_a = 4; 7 long var_b = 5; 8 auto var_c = var_a + var_b; 9 ::std::cout << "var_a: " << typeid(var_a).name() …

【C++ 小问答】1:模板实例化

问 以下 foo 函数模板被实例化多少次? 1template <typename T> 2void foo(T f) {} 3 4struct Bar { 5 void operator()(bool x) {} 6}; 7 8void f1(bool x) {} 9 10void f2(bool x) {} 11 12int main() { 13 foo(f1); 14 foo(Bar()); 15 foo(f2); 16 foo([](bool x){}); 17 foo([](bool x){}); 18} 答 使用 C++ Insights 生成该代码的编译器视角: 1template …