这是因为当您无需关心别名、外部更改的内存(指针所指的内存)、指针解引用的成本等问题时,值类型更容易理解。尽管我理解这些问题,但仍对特定情况有几个问题。
案例#0:
void foo(const float& f)
好的,我们这里有一个引用,但它是常量!确实,我们有一个常量视图(ref),因此在外部可能会更改,但这只会发生在多线程世界中,如果没有使用同步原语,则我不确定编译器是否必须考虑它。显然,如果我们在内部使用另一个指向任何浮点变量的指针/引用,我们可能会冒着修改f参数的风险。编译器可以将此参数视为安全的吗(假设我们不在内部使用任何float的引用/指针)?
案例#1:
void foo(vector f)
从C++11/14程序员的角度来看,我知道vector可以安全地移动到函数中。正如我们所知,容器在内部保存指向数组的指针。编译器能将指针视为安全(无外部修改),因为我们只是得到了vector的副本,因此我们是唯一的所有者吗?
换句话说:复制的对象是否被视为安全(因为逻辑上我们克隆了对象),或者编译器不允许做出这样的假设,任何指针/引用成员都必须视为可能危险,因为复制构造函数/运算符可能没有正确地复制。在复制它们时,程序员不应该负责处理共享资源吗?
底线:
常量指针/引用和复制的复杂对象通常比基本类型的副本慢,因此在性能关键的代码中应尽可能避免使用它们;还是它们效率略低,我们不应过于担心?