为什么我应该使用 const T& 而不是 const T 或 T&
Why should I use const T& instead of const T or T&
我总是使用const T&
将类传递给函数。像这样:
void foo(const MyType& p)
{
//...
}
但现在我很困惑,为什么不把const T
或T&
传递给函数呢?
顺便说一句,对于内置类型,如int
、long long
、double
,为什么const T
比const T&
谢谢你回答我的问题。
您可以传递这三个值中的任何一个(常量T、T&、或const T&)。它们都有不同的含义。由您决定是要传递一个无法修改的对象副本,还是传递一个对该对象的非常数引用,或是传递一个对此对象的常量引用。选择什么取决于代码的语义。总的来说,您应该选择const T&
而不是const T
,以避免将值从调用方复制到此函数(节省时间和内存)。此外(根据这个有用的链接),每当您希望不更改传递引用的值或状态时,您都希望使用const T&
而不是T&
。这可以防止愚蠢和被忽视的编码错误,例如出于测试目的更改字段。
关于将对const基元类型的引用作为参数传递的问题,请参见:C++和QT4.5-正在传递const int&过度杀戮?通过参考是否有助于信号/插槽?
const T是通过值传递的(需要复制),这对于一个类来说可能太多了,而对于内置类型来说应该是可以的。
T&是通过引用传递的,可以在常量T&不能,所以这取决于你需要做什么。
(我记得我在Effective C++中读过)
不,你没有,因为斯科特·迈耶斯不会犯这样的错误。
const T&
是最好的选择,因为它从不涉及副本,但仍然可以获取右值。考虑
void foo(int& p);
void foo(const std::string s);
int main() {
foo(1); // illegal!
foo("A reaaaaaaaallllllllllllllllllllllllllllllllllllllllllly long string");
// Nasty copy
}
如果您需要一个项目的副本,请在参数列表中创建一个(按值取值),但该值为const
的理由并不多。否则,请使用const T&
。对于一些廉价的类型,没有必要不按价值计价,因为你事先就知道复制是便宜的。
您总是通过const引用传递的规则过于笼统。
通过常量引用通常表示
- 该方法不会修改参数
- 该方法可能不会声称拥有该论点的所有权
- 呼叫方保证参数的生存期将比调用更长
如果您需要不同的东西,那么您应该选择不同于通过const引用传递的东西。
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 为什么函数声明中允许 const?
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 为什么通过指针编译时不能分配 const 初始化
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 为什么"std::add_pointer"会添加之前删除的"const"?
- 为什么 const 函数返回左值而不是右值?
- 为什么 const auto &p{nullptr} 在 C++17 中不起作用,而 auto *p{nullptr} 不起作用?
- 为什么 const 会阻止编译?
- 为什么构造函数 Message(const T&data) 与 Message(T&& data) 冲突,当 T = int&时?
- 在C++中,如果"int a = 3; int* p = &a;",那么为什么不允许"const int* &pp = p",但允许"const int* const &pp = p"?
- CStringArray::GetAt(int index) 返回一个 const. 为什么?
- 模板忽略const(为什么?)
- C++构造函数--通过引用传递仅适用于const.为什么?