C++在变态之路上一路狂奔

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.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值