1. 越来越多的deprecated出现在C++标准中,给人的感觉就是在仓促之中引入新的feature,结果又发现不合适,于是废弃。于是大家花费在这些废弃feature上面的精力就打了水漂。看下面的例子,C++17引入,26版本就要废弃,给人一种非常不严谨的感觉,只能说明这些feature是仓促引入的,咱能不能在引入前认真一下?

2. 语法越来越复杂,比如类内初始化,在声明成员变量时直接赋值,可以使用等号 = 或大括号 {},不知道两种方式有什么区别,除了增加记忆量,没见到有什么额外的益处。
3.打着增加性能的口号,引入右值的概念,以及一系列辅助概念,右值引用,完美转发,万能引用,除了增加复杂度之外,带来的那点所谓性能的提升,真的物有所值吗?在实际开发中,你右值使用的多吗?
4. C++的精髓就是指针,结果整出一堆智能指针,我觉得如果你有能力和精力用好所谓的智能指针,那么你肯定可以使用好裸指针,充分享受裸指针带给你的快感。
5. 我现在非常佩服编写C++编译器的,面对这些越来越多的语法,要做到包罗万象,我表示膜拜。
6.类似的特性,我们希望应用相似的规则,这样有两个好处:一是表达标准的严谨性,二是便于记忆,但C++反其道而行之。比如在应用泛型编程的时候,在候选决策上,我们知道编译器选择最佳候选项的原则是:特化版本优于偏特化版本,偏特化版本优于主模板版本。模板编程分类模板和函数模板,类模板应用于上述标准没有问题,针对函数模板,我们知道非模板函数优先级最高,那么针对模板函数,我们是否和类模板一样,应用上述原则呢?即特化>偏特化>主模板?看下面的例子,基于你的知识,请写下你的输出,然后我会点评。
#include <iostream>
#include <string>
using namespace std;
template<class T> /// 1
void foo(T t) {
cout << 0;
}
template<> ///2
void foo<int*>(int* t) {
cout << 20;
}
template<class T> ///3
void foo (T* t) {
cout << 30;
}
template<>
void foo<int>(int n)
{
cout<<40;
}
int main()
{
int i = 20;
foo(&i);
foo(i);
}
我直接公布答案吧:输出3040
首先明确一点:2和4是模板1的特化版本,1和3是并列的两个主模板函数。
这是因为模板函数匹配的时候,采取与类模板不一致的策略:首先遍历所有的主模板函数,找出一个最匹配的模板函数。然后再看该模板函数的特化版本中是否有更匹配的,如果有,就选择特化版本,如果没有,就选该模板函数。
针对这个例子,在执行foo(&i);// 首先遍历主模板函数,找到一个最匹配的模板,于是3在1 和3 中被选中。3被选中后,再看3的特化版本里面有没有更匹配的特化版本,没有,所以3被选中,输出30
在执行foo(i); //同样遍历主模板函数,找到一个最匹配的模板,这次是1在1和3中被选中,1被选中后,再看1的特化函数中有没有更匹配的特化版本,有,于是4被选中,输出40.

被折叠的 条评论
为什么被折叠?



