C++98/03 引用折叠和 cv 限定符

2023-11-26

下面的代码编译(gcc 4.7.2 或 icc 13)并生成“1 2”输出。意思就是const预选赛被取消,i。例如,f<int&>具有参数类型int&.

为什么会发生这种情况?据我了解,根据§14.3.1.4:

如果模板参数对应模板参数T命名一个类型“引用cv1 S”,尝试创建类型“引用cv2 T”创建类型“引用cv12 S“, 在哪里cv12是 cv 限定符的并集cv1 and cv2。多余的简历限定符将被忽略。

const不应被丢弃。这是代码:

#include <iostream>
using namespace std;

template <typename T>
void f(const T& t)
{
    t++;
}

int main()
{
    int a = 1;

    cout << a;
    f<int&>(a);
    cout << ' ' << a << endl;

    return 0;
}

GCC 4.7.2 确实not编译此标志时-std=c++98已指定。事实上,在 C++98(以及 C++03)中,对引用的引用不会崩溃。

尝试实例化f<int&>, where T = int&,产生以下函数签名(这里我故意切换参数类型的位置Tconst说明符,这是允许的,因为const T&是相同的T const&):

void f(int& const& t) // ERROR: reference to reference is illegal

上面的内容在 C++98 中不合法,在 C++03 中也不合法。一致地,这是您从 GCC 4.7.2 中得到的错误:

Compilation finished with errors:
source.cpp: In function 'int main()':
source.cpp:15:14: error: no matching function for call to 'f(int&)'
source.cpp:15:14: note: candidate is:
source.cpp:5:6: note: template<class T> void f(const T&)
source.cpp:5:6: note:   template argument deduction/substitution failed:
source.cpp: In substitution of 'template<class T> void f(const T&) [with T = int&]':
source.cpp:15:14:   required from here
source.cpp:5:6: error: forming reference to reference type 'int&'

尽管如此,如果您使用-std=c++11标志,则编译器在实例化模板时执行引用折叠:对左值引用的左值引用变成左值引用:

void f(int& const& t) == void f(int& t)

这里的const限定符被删除,因为它适用于参考,而不是引用的对象。由于引用不能重新分配,因此它们是const本质上,这就是为什么const被认为是多余的并被删除。看关于 SO 的问答以获得解释。

这会产生一个对左值引用的左值引用,该左值引用解析为简单的左值引用。因此,右侧的签名被实例化。

以上是解决这一呼吁的可行候选者f<int&>(a)因此,它编译时没有错误。

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

C++98/03 引用折叠和 cv 限定符 的相关文章

  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 使用 Linq 进行异步Where过滤

    我有一个List通过填充的元素async调用 WebService 没问题 我需要过滤该列表以便在应用程序视图上显示某些内容 我试过这个 List
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再

随机推荐

  • 错误!无法解析模块/操作。这通常表示拼写错误、集合丢失或模块路径不正确

    我的 Ansible 剧本中有一个 Ansible Collections 如下所示 name Create a profile for the user community windows win user profile usernam
  • 通过外部页面链接开通微信公众号

    我找不到任何关于这个问题的参考资料 我希望这里有人知道 我为客户创建了一个 html5 促销页面 该页面位于我的服务器上 我正在通过微信将页面地址分享给客户 他正在将其重新分享给他的朋友 当他们打开页面时 它会在微信应用浏览器中打开 到目前
  • 缩小评级栏大小时出现问题。

    我想减小评级栏的大小 我有一些样式属性可以做到这一点 但它们超出了用户交互的范围 它们只是指示器 所以 请告诉我如何缩小尺寸 提前致谢 如何粘贴给定的代码here 步骤1 您需要自己的评级星星res drawable 步骤 2 输入res
  • 使用 Group By 时出现 SQL 错误:每个 GROUP BY 表达式必须至少包含一列不是外部引用

    在执行我认为最简单的查询之一时 我遇到了此错误 我看到其他人也在这里遇到了问题 我已经浏览了我见过的每个解决方案 但他们有更多涉及的查询 所以我很难找出问题 我做了一个小虚拟表来说明我的问题 表名 组测试 id name 1 Mel 2 L
  • pandas groupby 之后并行应用

    我用过rosetta parallel pandas easy并行化apply after groupby 例如 from rosetta parallel pandas easy import groupby to series to f
  • Rust 如何处理杀死线程?

    生成的线程之间是否存在父子连接 如果我从生成其他线程的地方杀死该线程 那些线程也会被杀死吗 这个操作系统特定吗 Rust 如何处理杀死线程 事实并非如此 没有办法杀死一个线程 也可以看看 如何从另一个线程终止或挂起一个 Rust 线 程 R
  • 使用 JavaScript 将 1 年添加到日期

    我有以下日期 2014 10 29 我试图在日期上添加一年 不是 365 天 而是 1 年 var newDate new Date 2014 10 29 newDate setDate newDate getFullYear 1 var
  • 如何使用 WaitGroup 处理错误并终止 Goroutine

    我今天一直在研究 Goroutines Channels 和 WaitGroup 在阅读了一段时间之后 我终于开始理解这个概念了 我的问题是 我不确定在这样工作时如何处理错误 主要是因为我使用了 WaitGroup 使用 WaitGroup
  • 如何在 Lisp 中一次生成一个列表中元素的所有排列?

    我已经有了生成元素列表的所有排列的代码 然而 我意识到 如果我想操作生成的列表 我需要遍历这个列表 该列表可能会很大 因此维护成本很高 我想知道是否有一种方法可以通过每次调用生成排列 以便我可以检查列表是否与我需要的匹配 如果不匹配 我将生
  • 当存在重复的数组值时, array_diff() 具有“一对一”元素删除功能

    我有两个包含重复值的数组 test1 blah1 blah1 blah1 blah1 blah2 test2 blah1 blah1 blah1 blah2 我试图获得数组差异 result array diff test1 test2 e
  • 未解决的参考:kotlinx

    我正在尝试在 Android Studio 中尝试 Kotlin 和 Kotlin Android 扩展 我在 Ubuntu 14 04 上的 Android Studio v 1 5 1 和 OS X El Capitan 上的 Andr
  • 获取与正在运行的应用程序关联的图标

    有了打开的应用程序的窗口句柄 我就可以使用 GetWindowText 函数从应用程序的标题栏中检索文本 我想更进一步并检索与同一应用程序关联的图标 我该怎么做呢 我浏览了我认为相关的 Win32 API 部分 但什么也没引起我的注意 任何
  • WebDriverException:转发新会话时出错,找不到:{platform=WINDOWS,browserName=FIREFOX,version=3.6}

    我是 Selenium Web 驱动程序和 Grid 2 的新手 我正在尝试运行一个测试用例 但它给了我一个例外 线程 main org openqa selenium WebDriverException 中出现异常 转发新会话时出错 找
  • 正则表达式匹配一定长度的全大写单词

    我有一个函数可以为那些坚持将所有内容都大写的顽皮用户修复大小写 我希望我的函数仅在字符串包含时被调用由 3 个或更多大写字母组成的大写单词 这可以用正则表达式来完成吗 例子 例如 I false DEAL true Welcome fals
  • ClearCase:加载特定目录的旧版本?

    如何在 UCM 快照视图中加载旧版本的目录 在我们的项目中 一位开发人员将未编译和不可编译的代码签入到 ClearCase 其他开发人员更新了她的观点 然后他没有编译项目 因为以前的开发人员未编译代码 因此 开发人员只想获取目录的先前版本
  • 将 SQLite 填充到内存中以进行单元测试

    我正在考虑使用 SQLite 作为 Oracle 数据库的内存存根 我可以轻松地将所有 DAL 命令定向到 SQLite 但我现在想知道如何轻松填充每个测试方法的数据 每种方法是否应该首先创建所需的表并插入特定测试的行 我应该在夹具设置阶段
  • nginx入口控制器转发源ip

    我已经为应用程序设置了入口 但想要将我的 IP 地址列入白名单 所以我创建了这个 Ingress apiVersion extensions v1beta1 kind Ingress metadata annotations cert ma
  • 如何降低 Switch case 语句的循环复杂度

    有一个函数有 switch case 我们需要减少它的 CC string data string empty switch value case Less than 2 billion data 0 2B break case 2 bil
  • Google 即搜即得如何运作?

    关于新的谷歌即时搜索到底如何工作有什么想法吗 这似乎只是对旧搜索的 AJAX 调用 但要简化 Google 是相当困难的 有人有猜测吗 编辑 我知道每次按键都会发送 AJAX 但它是否具有预测性 或者您认为这只是常规的谷歌搜索 UPDATE
  • C++98/03 引用折叠和 cv 限定符

    下面的代码编译 gcc 4 7 2 或 icc 13 并生成 1 2 输出 意思就是const预选赛被取消 i 例如 f