C++11 const && 的绑定规则

2024-02-07

很多人不知道const右值引用是 C++11 语言的一部分。This http://www.codesynthesis.com/~boris/blog/2012/07/24/const-rvalue-references/博客文章讨论了它们,但在约束规则方面似乎是错误的。引用博客:

struct s {};

void f (      s&);  // #1
void f (const s&);  // #2
void f (      s&&); // #3
void f (const s&&); // #4

const s g ();
s x;
const s cx;

f (s ()); // rvalue        #3, #4, #2
f (g ()); // const rvalue  #4, #2
f (x);    // lvalue        #1, #2
f (cx);   // const lvalue  #2

请注意不对称性:虽然 const 左值引用可以绑定到右值, const 右值引用无法绑定到左值。在 特别是,这使得 const 左值引用能够执行所有操作 const 右值引用可以进行更多操作(即绑定到左值)。

示例代码上的注释似乎检查了我安装的 GCC 4.9(设置了 -std=c++14 标志)。那么,与博客文字相反,这是真的吗?const &&应该绑定到const & and const && and const &只绑定到const &?如果不是,实际规则是什么?


这是一个演示const &&绑定到const&在海湾合作委员会 4.9 中:http://coliru.stacked-crooked.com/a/794bbb911d00596e http://coliru.stacked-crooked.com/a/794bbb911d00596e


在这种情况下,“绑定”意味着将引用绑定到特定对象。

int a;

int &b = a; // the reference is 'bound' to the object 'a'

void foo(int &c);

foo(a); // the reference parameter is bound to the object 'a'
        // for this particular execution of foo.

http://coliru.stacked-crooked.com/a/5e081b59b5e76e03 http://coliru.stacked-crooked.com/a/5e081b59b5e76e03

然后阅读引用:

请注意不对称性:虽然 const 左值引用可以绑定到右值,

void foo(int const &);

foo(1); // the const lvalue reference parameter is bound to
        // the rvalue resulting from the expression '1'

http://coliru.stacked-crooked.com/a/12722f2b38c74c75 http://coliru.stacked-crooked.com/a/12722f2b38c74c75

const 右值引用无法绑定到左值。

void foo(int const &&);

int a;

foo(a); // error, the expression 'a' is an lvalue; rvalue
        //references cannot bind to lvalues

http://coliru.stacked-crooked.com/a/ccadc5307135c8e8 http://coliru.stacked-crooked.com/a/ccadc5307135c8e8

特别是,这使得 const 左值引用能够执行 const 右值引用可以执行的所有操作,甚至更多(即绑定到左值)。

void foo(int const &);

foo(1); // const lvalue reference can bind to rvalue

int a;
foo(a); // and lvalue

http://coliru.stacked-crooked.com/a/d5553c99e182c89b http://coliru.stacked-crooked.com/a/d5553c99e182c89b

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

C++11 const && 的绑定规则 的相关文章

  • ASP.NET 会员电子邮件验证

    尝试基于 C 创建电子邮件验证本文 https web archive org web 20211020153319 https www 4guysfromrolla com articles 062508 1 aspx 我创建了一个 ja
  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • 函数的不明确的引用/值版本

    考虑以下函数原型 void Remove SomeContainer Vec const std size t Index SomeContainer Remove SomeContainer Vec const std size t In
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • 错误“将 varchar 值“July”转换为数据类型 int 时,消息 245,级别 16,状态 1,第 22 行转换失败。”

    SELECT CAST DATEDIFF day 21 JULY 2017 CAST DAY DATEADD mm DATEDIFF mm 1 21 JULY 2017 0 1 LEFT CONVERT VARCHAR DATENAME M
  • 带有 git 子模块的多个 ssh 密钥

    我使用的是企业版 GITHUB 我正在创建一个自动构建服务器来构建我们的项目 这些项目有子模块 由于此构建服务器不是 我 它无法拥有我的用户凭据 因此它需要能够通过 github 部署密钥 功能从 GIT 下载项目 每个项目只读 ssh 密
  • ExceptionFilter 不运行 .NET Core Web Api

    我的操作过滤器有问题 我的过滤器都没有运行 我正在使用 NET Core 2 2 并构建 Web Api 我在控制器中使用 CustomExceptionFilter 注册了它 HttpDelete id CustomExceptionFi
  • NuGet 服务器 - 私有存储库 - 动态更改 nuget 包位置

    我们正在为我们自己的私有 nuget 包使用私有存储库 我们能够为每个客户更改 nuget feed 但 nuget 包位于 Web Config 中指定的位置 是否可以通过路由 URL 动态更改位置 我已经提到了这个博客http blog
  • 如何在Javascript中使用jade Mixin?

    在翡翠中 我正在做测试混合 mixin test testName test span Test String 但我想在javascript中使用它 这是在jade文件中声明的 script type text javascript doc
  • Keras CNN:将文本作为除图像之外的附加输入添加到 CNN

    我正在尝试训练 CNN 进行对象分类 因此 除了图像之外 我还想输入一些文本特征 我在这里找到了一个这样做的例子http cbonnett github io Insight html http cbonnett github io Ins
  • XNA DrawString() 仅绘制部分字符串

    我有一个问题DrawString in XNA 我使用多个SpriteBatches对于几个逻辑层 例如 背景 对象 菜单等 在我的菜单批处理中 我绘制了一个菜单 背景中的大灰色框 按钮 菜单上较小的灰色框 以及按钮的字符串 问题 http
  • 为什么即使在“git checkout --”之后,Git 仍坚持认为文件已被修改?

    我在本地更改了几个文件 而不承诺它们 git status shows gt gt git status On branch feature ravendb Your branch is ahead of origin feature ra
  • 如何在 Struts 2 中使用注释定义拦截器

    我正在尝试使用struts2 convention plugin它提供了Java注释来定义Struts2组件 With Action到目前为止一切都很好 但是我如何使用注释来定义拦截器 我说的是 InterceptorRefs or Int
  • GNU/Linux 下的 Boost.Log 链接错误

    我想测试 Boost Log 库 不幸的是 我收到链接错误 我使用 Arch Linux 并通过内置包管理器安装了 Boost 标头和库pacman 提升1 54 0 3 升压库 1 54 0 2 编译简单示例时官方网站 http boos
  • 多次捕获组

    最近我一直在玩Java中的正则表达式 我发现自己遇到了一个 理论上 很容易解决的问题 但我在想是否有更简单的方法来做到这一点 是的 是的 我很懒 问题是多次捕获一个组 这是 public static void main String ar
  • Javascript 返回错误的日期值 (NodeJS)

    我正在开发 NodeJS 项目 但得到了错误的日期值 我不明白我做错了什么 var d new Date results 1 timestamp console log results 1 timestamp 2016 05 10T13 2
  • 如何在SQL中计算IPv6 CIDR路由前缀?

    我一直致力于使用在 SQL Server 2012 实例上运行的 T SQL 从 IPv4 和 IPv6 地址范围生成 CIDR 一般来说 我们的应用程序 数据库外部 负责计算 CIDR 但我目前需要在数据库中进行 CIDR 计算 由于 I
  • 在 UITableView 中显示多个自定义单元格?

    我在 SnowLeopard 上使用 Xcode 4 2 我的项目正在使用故事板 我正在尝试实施一个UITableView具有 2 种不同的自定义细胞类型 sessionCelland infoCell 我可以让这两种类型出现在同一个列表中
  • AvalonDock 2 与 Caliburn Micro

    是否有关于将 AvalonDock 与 Caliburn Micro MVVM 结合使用的博客或文章 谷歌搜索时没有找到太多 http avalondock codeplex com http avalondock codeplex com
  • 在 Golang 中测试 HTTP 路由

    我正在使用 Gorilla mux 和 net http 包创建一些路由 如下所示 package routes some imports some stuff func AddQuestionRoutes r mux Router s r
  • 当耗尽 Kubernetes 集群中的节点时会发生什么?

    当您耗尽 Kubernetes 集群中的节点时 我想了解一些有关维护准备的说明 这是我在跑步时所知道的kubectl drain MY NODE 节点被封锁 Pod 正常关闭 您可以选择忽略 Daemonset pod 因为如果它们被关闭
  • 强大的javascript画布库[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 jQuery 解析不带引号的 JSON 数据

    我正在尝试使用通过 AJAX 从远程服务器获取的 jQuery 解析 JSON JSON 数据如下 identifier ID label LABEL 但无法 显然 字段标识符和标签没有双引号 当在我的本地测试站点上使用双引号进行测试时 它
  • C++11 const && 的绑定规则

    很多人不知道const右值引用是 C 11 语言的一部分 This http www codesynthesis com boris blog 2012 07 24 const rvalue references 博客文章讨论了它们 但在约