值参数的常量正确性

2023-12-01

我知道关于 const 正确性的问题很少,其中指出函数的声明及其定义不需要就值参数达成一致。这是因为值参数的常量仅在函数内部重要。这可以:

// header
int func(int i);

// cpp
int func(const int i) {
    return i;
}

这样做真的是最佳实践吗?因为我从来没有见过有人这么做过。我在其他地方看到过这句话(不确定来源):

“事实上,对于编译器来说,无论是否在值参数前面包含此 const,函数签名都是相同的。”

“避免在函数声明中使用 const 值传递参数。如果不被修改,仍应在同一函数的定义中将参数设置为 const。”

第二段说不要将 const 放在声明中。我认为这是因为值参数的常量作为接口定义的一部分是没有意义的。这是一个实施细节。

基于这个建议,对于指针参数的指针值是否也有建议? (它对引用参数没有意义,因为您无法重新分配引用。)

// header
int func1(int* i);
int func2(int* i);

// cpp
int func1(int* i) {
    int x = 0;

    *i = 3; // compiles without error
    i = &x; // compiles without error

    return *i;
}
int func2(int* const i) {
    int x = 0;

    *i = 3; // compiles without error
    i = &x; // compile error

    return *i;
}

Summary:设置值参数对于捕获一些逻辑错误很有用。这是最佳实践吗?您是否会极端地将 const 排除在头文件之外?它与 const 指针值一样有用吗?为什么或者为什么不?

一些参考:

C++ const 关键字 - 随意使用? 使用“const”作为函数参数

const 值参数何时有用的示例:

bool are_ints_equal(const int i, const int j) {
    if (i = j) { // without the consts this would compile without error
        return true;
    } else {
        return false;
    }
    // return i = j; // I know it can be shortened
}

我对此的看法:

这不是一个坏主意,但问题很小,你的精力最好花在其他事情上。

在您的问题中,您提供了一个很好的示例,说明何时可能会捕获错误,但有时您最终也会做这样的事情:

void foo(const int count /* … */)
{
   int temp = count;  // can't modify count, so we need a copy of it
   ++temp;

   /* … */
}

无论哪种方式,优点和缺点都很小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

值参数的常量正确性 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • python用多个键填充搁置对象/字典

    我有一个 4 gram 列表 我想用它来填充字典对象 shevle 对象 I go to work I go there often it is nice being I live in NY I go to work 这样我们就有了类似的
  • Python 中递归调用的 return 语句如何保存中间值?

    正在查看一些与递归调用相关的 python 代码 并注意到 return 语句看起来很有趣 当下一次递归调用的返回语句中没有变量赋值时 递归如何工作 当进行递归调用时 中间求和值没有存储在明显的位置 调试器似乎显示列表每次调用都会减少一 但
  • NLog 内部记录器的编程配置

    任何人都可以帮助 NLog 内部记录器的编程配置吗 我有各种目标 电子邮件目标不发送任何电子邮件 尽管它确实有日志记录规则 所以我希望通过启用内部日志来获得更多见解 但是 我进行了编程配置 但没有找到任何在代码中设置内部记录器的资源 索姆斯
  • 定义一个特定表格单元格的高度

    我有一个带有两个自定义单元格的 tableView 我需要定义一个单元格的高度 但不理会另一个单元格的高度 我正在尝试学习 Objective C 所以任何帮助将不胜感激 在 UITableView 委托中 实现例程 tableView h
  • 如何比较两个数组列表中至少有一个属性不同的相似对象?

    我有两个数组列表 每个都有用户类型的对象列表 User 类如下所示 public class User private long id private String empCode private String firstname priv
  • 将字节数组转换为字符串 (Java)

    我正在 Google app Engine 中编写一个网络应用程序 它允许人们基本上编辑 html 代码 并将其存储为 htmlblobstore 中的文件 我正在使用 fetchData 返回一个byte 文件中的所有字符 我正在尝试打印
  • 将文本数据库分成 N 个相等的块并保留标题

    我有几个大型 30 百万行 文本数据库 我正在使用以下代码清理它们 我需要将文件拆分为 100 万行或更少 并保留标题行 我查看了 chunk 和 itertools 但无法得到明确的解决方案 它用于 arcgis 模型 根据 icyroc
  • 如何设置引导文本的大小和卡片大小

    我使用引导程序实现了该卡 但我的卡片尺寸根据文本字符的数量而变化 详细信息链接也有所不同 当我缩小浏览器时 它会与我的卡片文本重叠 如何固定卡片文字的大小 类 card text 以避免重叠并避免不同的卡片尺寸 div class card
  • 如何愚弄jqXHR始终成功

    我试图让 jQuery 的 ajax 调用总是返回 就像它们成功一样 例如即使没有网络 我也会返回一些本地保存的数据 这可能吗 我尝试使用 ajaxPrefilter 并调用 jqXHR 的成功函数 但它仍然不会表现得好像请求已经完成 Th
  • 这是我的网络应用程序的“记住我”功能的合法实现吗?

    我正在尝试向我的网络应用程序添加 记住我 功能 以使用户在浏览器重新启动之间保持登录状态 我想我已经得到了大部分 我使用谷歌应用程序引擎作为后端 它允许我使用java servlet 这是一些演示的伪代码 public class MySe
  • Docker 网络 Nginx 解析器

    我正在尝试删除配置中已弃用的 Docker 链接 剩下的就是摆脱那些Bad Gateway当我重新创建容器时 nginx 反向代理错误 注意 我在桥接模式下使用 Docker 网络 docker network create nettest
  • 从 sqlite 存储和检索 Uri

    我是一名新手开发人员 目前正在开发一个应用程序 其中部分功能允许用户捕获图像 将其存储在应用程序的文件系统中 并将其引用存储在 SQLite 数据库的列中 然后 用户将能够根据与数据库中关联的任何标准在网格视图中查看这些图像 例如 仅显示特
  • 如何使用 python 3.8.1 将 django 应用程序部署到heroku?

    我正在尝试将 django 应用程序部署到 heroku 安装 django heroku 时出现错误 越来越失败了错误是 从源代码构建 psycopg2 需要 pg config 我也尝试安装psycopg2 它也失败了 我使用的是 Ma
  • 触发电子邮件验证

    我正在使用自定义策略 期望的用户旅程是 用户在屏幕 1 上输入电子邮件 密码 成功验证屏幕 1 后 用户将转到屏幕 2 在屏幕 2 中 用户必须输入发送到其电子邮件的代码 请注意 用户在注册时已经验证了电子邮件 我被困在让 2 人去工作 目
  • PayPal 免费试用期的实施不会返回任何自定义参数

    最近两天一直被这个问题困扰 Scenario 我们有一个基于网络的产品 用户可以免费注册 14 天 之后每月订阅 60 美元 一旦用户点击 使用 Paypal 付款 按钮 页面将把用户带到 Paypal 一旦他们完成付款 它就会重定向回我们
  • 如何在不禁用firewalld(Kubernetes)的情况下使用Flannel

    我是法兰绒和 K8s 的新手 我正在我的 1 个主节点和 2 个节点集群 由 KVM 创建 上使用它们 我使用 flannel 网络插件初始化了集群 然后我发现我无法访问内部 结果发现可能是我的网络或者DNS进程出了问题 下列的https
  • 具有继承列表的自动映射器

    仅供参考 这与这个问题不同自动映射器以及从集合或列表继承 这是我继承的列表 public class MyPagedList
  • 在模拟器中使用 Google 登录按钮时出现问题

    当我单击 Google 登录按钮时 它会显示以下对话框 我单击 更新 但没有任何反应 但我的 logcat 给出了以下输出 01 24 07 38 48 121 W GooglePlayServicesUtil 1305 Google Pl
  • 日期时间差异

    我有2个变量 GMDCOMTM which stores the date time Tue Oct 1 13 32 40 2013 GMDRRSTM which stores the date time Tue Oct 2 23 35 3
  • 值参数的常量正确性

    我知道关于 const 正确性的问题很少 其中指出函数的声明及其定义不需要就值参数达成一致 这是因为值参数的常量仅在函数内部重要 这可以 header int func int i cpp int func const int i retu