为什么我可以在私有类型上使用 auto?

2024-01-02

我对以下代码的编译和运行感到惊讶(vc2012 & gcc4.7.2)

class Foo {
    struct Bar { int i; };
public:
    Bar Baz() { return Bar(); }
};

int main() {
    Foo f;
    // Foo::Bar b = f.Baz();  // error
    auto b = f.Baz();         // ok
    std::cout << b.i;
}

这段代码编译正确吗?为什么它是正确的?为什么我可以使用auto在私有类型上,而我不能使用它的名称(如预期的那样)?


规则为auto大多数情况下,与模板类型推导相同。发布的示例的工作原理与您可以将私有类型的对象传递给模板函数的原因相同:

template <typename T>
void fun(T t) {}

int main() {
    Foo f;
    fun(f.Baz());         // ok
}

您可能会问,为什么我们可以将私有类型的对象传递给模板函数?因为只有类型的名称是不可访问的。该类型本身仍然可用,这就是为什么您可以将其返回给客户端代码。

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

为什么我可以在私有类型上使用 auto? 的相关文章

随机推荐

  • 已标记我的主页的帖子不会通过 API 调用显示

    我为我的服务创建了一个 Facebook 页面here http www facebook com pages Rowz 265813166783408 该页面的名称是 Rowz 该页面上有一些用户在自己的墙上的帖子中标记了该页面的帖子 这
  • PHP 读取最快的序列化数据格式

    我有一个 PHP 前端和一个 C 后端 我需要能够将一组名称发送到前端 对于 PHP 来说 哪种序列化格式读取最有效 最快 示例数据 group1 name1 3923 name2 9879 name3 8944 group2 name5
  • Oracle 星期几问题[重复]

    这个问题在这里已经有答案了 然而 下面的语句返回正确的星期几 当 case 子句中使用表达式时 它不起作用 Select to char SYSDATE Day Dwo case when to char SYSDATE Day Thurs
  • 如何查找包中的活动名称?安卓。亚行外壳

    我可以获得 Android 上安装的所有软件包的列表 但要打开应用程序 我需要活动名称和软件包名称 有没有办法通过 adb shell 列出包中的所有活动 从手机中提取的 Android 清单文件没有帮助 因为它是文件的二进制版本 因此不包
  • array_push 不会给出数组,而是打印出整数值

    我正在使用 array push 编写一个非常简单的 php 程序 但根据文档它无法正常工作 每次我尝试打印最终数组的值时 它都会给我一个整数 有人可以帮我解决这个问题吗 这是我的代码 这是它的输出 9 先谢谢您的帮助 array push
  • Nginx 不将 Cookie 传递给代理

    我有一个 cookie 设置适用于所有子域 example com 我有 nginx ajax 调用通过 proxy pass 但 cookie 不会保留 我的配置如下 server listen 80 server name www ex
  • 如何在 Emacs/elisp 风格的正则表达式中用“\(”替换“(”?

    问题如标题 更具体地说 我厌倦了打字 等等 每次我想在 Emacs 的 交互式 正则表达式函数中使用括号 更不用说 在代码中 所以我写了类似的东西 defadvice query replace regexp before my query
  • MvvmCross Xamarin.Forms 模态对话框

    我只是想用 MvvmCross 制作我的第一个应用程序 但我的应用程序已经遇到了问题 并且在网络上找不到任何相关内容 我想在支持的设备 例如 iPad 上打开特定页面作为模式对话框 对于我的非 MvvmCross 应用程序 我使用 Rg P
  • 如何使用 Bootstrap 3 模态来实现 JavaScriptalert()?

    如果我的 HTML 标头中的 JavaScript 代码中有警报 例如 有没有办法可以使用 Bootstrap 中的模式窗口而不是浏览器的本机警报窗口 如果是这样 有人可以向我展示上面一行代码的简单示例吗 模式应该只有一个 确定 按钮 没什
  • p5.j​​s 中的上下移动(并使用 WASD)

    在p5中如何使用键盘让角色移动 我的意思是 不仅仅是向左和向右 我还想使用 WASD 键 我用过这个 形状作为占位符 https editor p5js org TheDiamondfinderYT present 8ZqV2LsVB ht
  • 如何用Pickle存储自我价值?

    class Player def init self self money 0 self level 0 self xp 0 self xp until level 20 self taxi car Cabbie self busines
  • 在 Jenkins 中配置 GitLab 存储库

    我正在尝试配置 Jenkins 在 Windows Server 2008 上运行 以连接到 GitLab 6 0 存储库 在 Linux 机器上 从我的本地 Windows 盒子中 我可以使用 SSH URL 来克隆我的 GitLab 服
  • 将参数传递给另一个可变参数函数

    有没有什么方法可以让这段代码按预期编译和工作 而无需求助于va list stuff include
  • Android LVL(许可服务)非常慢! ——解决方案?异步?

    我在网上查了一下 看到其他一些帖子抱怨 Android 许可 LVL 库如何缓慢 但没有解决方案 在 HTC Thunderbolt 全新手机 上 它会使测试应用程序的启动时间延迟 3 5 秒以上 有人对异步调用这个库有任何经验或想法吗 其
  • 如何让 Eclipse 自动生成新 Java 类的 main 方法?

    有谁知道我的 Eclipse 不预加载的原因 public static void main String args 当我创建一个新课程时 我该怎么做才能让它自动出现 Type main and press ctrl space The e
  • 提取 Windows 中任何文件的缩略图

    从任何文件 而不仅仅是不同大小的图像 中提取缩略图的最有效方法是什么 我已经查看了所有内容 其中最有希望的是 Windows API ShellFile 但它似乎没有正确安装 我使用的是Windows 7 不久前 我编写了一个 Thumbn
  • 这些 Linux 内核 Oops 字段的含义是什么?

    我在开发人员的生活中已经遇到过一些 Oops 虽然我熟悉可以从这些 Oops 中检索到的一些信息 但仍然有一些信息我无法理解 因此无法用来解决问题 下面您将找到一个 Oops 示例 我将描述我可以从中推断出什么 然后 我会问剩下的信息可以告
  • Django在syncdb时以自定义方式初始化数据库

    我在开发过程中使用 Django 令人烦恼的是 每次我对模型进行一点更改时 我都需要删除数据库并运行syncdb 为了测试的目的 我想每次运行syncdb时自动将一些初始数据添加到数据库中 我尝试将这些代码放入一个应用程序中 init py
  • bash:如何在没有 date -d 选项的情况下比较 Solaris 上的两个日期

    我试图将日志文件行中输入的日期与昨天的日期进行比较 如果差异超过一天 则它会打印日志文件中的该行 日志档案 more ActiveX2Alarms log 2016 09 30 01 40 14 MET faultManager netwo
  • 为什么我可以在私有类型上使用 auto?

    我对以下代码的编译和运行感到惊讶 vc2012 gcc4 7 2 class Foo struct Bar int i public Bar Baz return Bar int main Foo f Foo Bar b f Baz err