读 Effective Modern C++ 记录

item 1

函数参数可以声明为数组的引用:

const char name[] = "J. P. Briggs";  // name's type is const char[13]

//T推导出来的实际类型是数组, 类型推导包括了数组的长度
template <typename T> void f(T &param)
{
    cout << sizeof(param) << endl; //13
}
//T推导出来的实际类型是const char *
template <typename T> void f2(T param)
{
    cout << sizeof(param) << endl; // 4 or 8
}

声明数组的引用使得可以创造出一个推导出数组元素数量的模板:

template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept
{
    return N;
}

//再比如std::end对数组的特化
template <class T, size_t N>
T* end(T(&arr)[N])
{
    return arr + N;
}

item 4

让编译器指示decltype推导出来的类型:

template <typename T>
class TD;

int main()
{
    int x;
    TD<decltype((x))> xType;
    return 0;
}

错误消息类似error: aggregate 'TD<int&> xType' has incomplete type and cannot be defined。

item 12

成员函数的引用修饰符使得这些函数只能被左值或右值引用:

class Widget
{
public:
    void doWork() &;   // this version of doWork applies, only when *this is an lvalue
    void doWork() &&;  // this version of doWork applies, only when *this is an rvalue
};

Widget makeWidget();      // factory function (returns rvalue)
Widget w;                 // normal object (an lvalue)
w.doWork();               // calls Widget::doWork for lvalues
makeWidget().doWork();   // calls Widget::doWork for rvalues

item 15

const是readonly的意思。
所有constexpr对象都是const的,但不是所有const对象都是constexpr的。

如果你想编译器保证一个变量有一个可以放到那些需要编译期常量的上下文的值,你需要的工具是 constexpr 而不是 const。

如果使用场景涉及函数,那 constexpr 就更有趣了。如果实参是编译期常量,它们将产出编译期值;如果是运行时值,它们就将产出运行时值。

我的理解是,constexpr 函数帮助编译器把一些可以在编译期进行的计算放到编译期来做。还挺麻烦的,平常也没多大必要使用。

item 31

lambda只能捕获所在作用域里的非静态局部变量或函数参数。全局变量或静态局部变量,无需捕获便可使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值