为什么私有成员变量不允许使用 decltype?

2024-03-09

假设我有一个这样的类:

class Foo
{
  std::vector<int> bar;

public:
  std::vector<int>& get_bar() { return bar; }
};

后来,我想要在其他地方有另一个变量,其类型与bar。如果我能这样做的话,这对我来说是有意义的:

decltype(Foo::bar) clone_of_bar;

但这是行不通的。编译器告诉我'std::vector Foo::bar' 是私有的.

所以我最终不得不使用这样的东西:

std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;

这可行,但看起来一团糟。也许有更简单的方法;我不太确定。但我真正想知道的是为什么我不能只使用decltype(Foo::bar)。为什么有人要关心这个bar是私人的吗?这并不是说我实际上正在访问该变量。

decltype是该语言的一个新特性。我只是不明白为什么它被设计为不适用于私有变量。


用语言律师术语来说,bar是一个名称,用在decltype表达式编译器必须执行正常的名称查找,这尊重访问控制。
为什么要decltype与该语言的其他部分的设计不同吗?您没有提出任何令人信服的论据来说明为什么它不应该与例如一致。sizeof.

作为类作者,我不希望您能够查询这样的私有实现细节。如果我希望该类型在类之外可用,我会定义一个公共 typedef 告诉您它是什么类型。

后来,我想要在其他地方有另一个变量,其类型与bar

您想要与私有实现细节类型相同的“另一个变量”吗?所以如果类的作者Foo重构他们的代码并用其他一些实现细节替换类型,突然你的代码改变了含义,不相关的代码可能会突然停止编译或默默地有不同的行为,因为该代码愚蠢地依赖于与其无关的私有细节。这将引入私有实现细节和作者所不相关的代码之间的耦合Foo甚至可能不知道存在!这是一个糟糕的主意。

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

为什么私有成员变量不允许使用 decltype? 的相关文章

  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 模板与非模板类,跨编译器的不同行为

    我在一些应用程序中使用编译时计数器 它确实很有用 昨天我想用 gcc 编译一个程序 我之前使用的是 msvc 并且计数器的行为在模板类中发生了变化 它在模板类中不再工作 过于简化的代码 Maximum value the counter c
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 在 LP2844Z(Zebra 打印机)上的收据中包含 PNG [重复]

    这个问题在这里已经有答案了 我正在致力于创建一个基于 HTML5 画布的签名 绘图框 目前我们在服务器上将画布保存为PNG 但可以轻松地将base64字符串保存在数据库中 现在的问题是我们如何在打印的收据上添加签名 目前我们使用 GF 字段
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • 如何在 Pygame 中显示精灵?

    这只是一个关于 PyGame 中精灵的简单问题 我按照下面的代码加载了图像 我只是想知道如何在 PyGame 中显示精灵 例如绘制矩形或圆形 无论如何 我不想让它表现得如此 我想我用一个blit命令 但我不确定并且我在网上没有找到太多信息
  • 多线程环境登录并测试

    请让我知道您在以下场景中如何设计日志记录以及如何测试日志记录的建议 我有一个可以由多个线程调用的 API 单个线程对该 API 的一次调用会生成 50 KB 的日志 是否存在用于在多线程环境中进行日志记录的设计模式 IE所有线程使用一个日志
  • 如何在 Kotlin 中手动将字节分配给 long?

    我正在尝试做这样的事情Kotlin val top Long 1000000 1000000 1000000 1000000 1000000 1000000 1000000 In Java它看起来像这样 long TOP 1000000 1
  • lambda 函数比委托/匿名函数更快吗?

    我以为lambda functions delegates and anonymous functions具有相同的主体将具有相同的 速度 但是 运行以下简单的程序 static void Main string args List
  • 用于捕获 MSWord 文档事件的 IAdviseSink 设置

    这是我尝试设置的代码IAdviseSink在我的接口中实现的TForm1用于捕获新创建的 MSWord 文档的一些事件的类 代码运行时没有任何错误 但在保存文档或关闭文档时无法捕获任何事件 如何设置IAdviseSinkMSWord 文档正
  • 如何删除 Google 地图 v2 中的标记?

    我使用以下方法在地图上添加了标记 并保留了标记记录 public static void showallLocations ArrayList
  • 如何在 Angular 2 中触发 ajax 请求?

    我在 Angular 2 中定义了这样的服务 import Inject from angular2 angular2 import Http Headers HTTP PROVIDERS from angular2 http export
  • 为什么docker容器内存使用不减少?

    我正在运行 Java REST 应用程序Apache JavaSpark http sparkjava com 在此容器中 但我注意到每个请求都会增加内存使用量 并且在请求完成后不会减少内存使用量 我的第一个猜测是我忘记关闭一些流 缓冲区
  • 针对 PGPool II 的 Java 查询导致“未命名的预准备语句不存在”错误

    我有一个使用 Postgres 数据库的 Java 应用程序 我正在尝试引入 PGPool 来扩展我的数据库 我遇到了一个问题 Postgres 抛出以下错误 unnamed prepared statement does not exis
  • 缩放图像保持纵横比,然后在流体高度和宽度 DIV 内垂直和水平居中

    好吧 这有点拗口 而且非常具体 我会尽力解释 目标是在缩放图像时保持纵横比 并使其在仅由百分比定 义的 DIV 内保持垂直和水平居中 图像需要保持最佳拟合 因此如果需要最大宽度 则使用它 反之亦然 Use Firefox 版本 33 或一些
  • 如何在 R 中编写 .bin 文件并在 Fortran 中打开它

    我有一个 Fortran 模型 我想强制使用来自 R 开发的模型的数据 但我在两个环境之间传输数据时遇到问题 我正在考虑使用 bin 文件 我在 R 中所做的是使用writeBin将多维数组存储在 bin 文件中 a seq 1 150 1
  • hibernate @Entity 仅在内部类上(顶级类不是 @Entity)

    我想将内部类保留到数据库中 但这不起作用 有可能这样做吗 或者我应该将该内部类放入新的普通文件中 现在我收到错误 IllegalArgumentException Unknown entity models foo bar 我的班级文件 p
  • 在android语音识别中,如何增加考虑输入完成的时间?

    在android语音识别中 任何人都可以知道如何增加我们停止听到语音后考虑输入可能完成所需的时间 我需要防止端点在语音识别时在非常短的语音中间停顿期间中断 如果有人知道解决办法 请回复 任何回应将不胜感激 提前致谢 你好 我也遇到这个问题
  • jQueryUI 自动完成 - 当没有返回结果时

    我想知道当使用时从服务器返回空结果时如何捕获并添加自定义处理程序jQueryUI 自动完成 http jqueryui com demos autocomplete 在这一点上似乎有一些与各种 jQuery 插件相关的问题 例如当结果为空时
  • 从作为 Azure Web App 托管的 ASP.NET 5 应用程序进行日志记录

    我有一个 ASP NET 5 Web API 作为 Web 应用程序托管在 Azure 中 我想使用 Azure 诊断记录我的代码中的消息 有多篇文章包括Azure 文档 https azure microsoft com en us do
  • Azure Web 角色进程未加载 web.config?

    我正在 Windows Azure 模拟器中运行一个 Web 项目 但未加载 web config 我正在作为完整的 IIS 应用程序运行 在 dev Fabric 启动后 我可以转到在 IIS 中运行的应用程序 浏览到文件位置 并验证文件
  • 不要在 git grep 输出中显示 ^M(回车符)

    为了隐藏可怕的事情 M字符来自git diff 必须配置 core whitespace cr at eol 但它们仍然显示在git grep输出 怎么解决呢 编辑 我正在运行的 grep 是 git grep i line number
  • XAML 的延迟加载

    我正在处理的一个项目有一些相当复杂的 XAML 它明显影响了视觉性能 相当多的控件在初始状态下是折叠的 然而 由于它们的 XAML 已被解析并构建了可视化 逻辑树 因此显示几乎空白对象的速度非常慢 看起来 并且需要在此确认 使用初始状态为
  • menuitem 上的 actionlayout 不执行任何操作

    我正在菜单项上设置 actionLayout 并设置背景颜色和图像 但它不受尊重 在我的活动中 我有 getMenuInflater inflate R menu submit action menu 我的提交操作是 menu menu
  • 为什么私有成员变量不允许使用 decltype?

    假设我有一个这样的类 class Foo std vector