Loading... # 1 最大匹配原则 ```cpp #include <iostream> int main() { int a = 5,b = 2; std::cout << a+++++b; } ``` 结果: CE ## 解析 乍一看像是UB,但是实际根据最大匹配原则,a的后自增优先级最高,然后会左到右贪婪结合下去,结果就是`(a++)++ + b`显然是CE。 (感觉这知识没意义,从写出这种表达式开始就已经错得离谱了) # 2 lambda返回值推导 ```cpp #include <iostream> struct A { A() { std::cout << "a"; } void foo() { std::cout << "1"; } }; struct B { B() { std::cout << "b"; } B(const A&) { std::cout << "B"; } void foo() { std::cout << "2"; } }; int main() { auto L = [](auto flag) -> auto {return flag ? A{} : B{};}; L(true).foo(); L(false).foo(); } ``` 答案: ```cpp aB2b2 ``` ## 解析 `auto`作为返回值,其类型推导**应用模板实参推导的相同规则**。所以**多重return只要返回类型(经推导)相同即可**。························································································ > 见[模板实参推导](https://zh.cppreference.com/w/cpp/language/template_argument_deduction#.E5.85.B6.E4.BB.96.E8.AF.AD.E5.A2.83) 大体来说,每一个形参/实参对都会被单独推导,最终每一对都必须得到无歧义的推导结果,否则编译失败。 模板实参推导在首次失败时,考虑一个限定转换序列(即隐式转换): ![image.png](https://zclll.com/usr/uploads/2022/06/4250008132.png) 本题就是考虑了这样一个具有一个用户定义转换的序列,从而让B的拷贝构造函数参与到`auto`类型推导当中去,从而让`A{}`和`B{}`推导出相同的类型。 # 3 字符串到bool ```cpp #include <iostream> int main() { std::cout << +!!""; } ``` 答案: ```cpp 1 ``` ## 解析 `""`作为字符串字面量,其类型为`const char[]`。会首先被转换为**指针**再去到`bool`值。 # 4 [向上转型与虚函数](https://cppquiz.org/quiz/question/18?result=OK&answer=B&did_answer=Answer) ```cpp #include <iostream> class A { public: virtual void f() { std::cout << "A"; } }; class B : public A { private: void f() { std::cout << "B"; } }; void g(A &a) { a.f(); } int main() { B b; g(b); } ``` 输出: ```cpp B ``` ## 解析 **访问权限是编译期检查的,并非运行期间。** 因此,在`g()`中,代码是正确的。调用时触发了隐式的向上转型。由于<span style='color:red'>引用和指针一样可以表现多态</span>,所以正常调用了`B::f()`! © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏