- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
似乎 C++11 和 C++14 对待纯右值的 cv 限定不同。
C++11 坚持自 C++98 以来一直存在的“经典”方法:根据 3.10/4 “非类纯右值始终具有 cv 非限定类型”。
C++14 在 3.10/4 中包含类似的措辞,但它以注释的形式呈现:"[注意:类和数组纯右值可以有 cv 限定类型;其他纯右值总是有 cv 非限定类型. 见第 5 条。——尾注]"
在第 5 条中它说:
6 If a prvalue initially has the type “cv T,” where T is a cv-unqualified non-class, non-array type, the type of the expression is adjusted to T prior to any further analysis.1
这个 5/6 条目是 C++14 中的新条目。它现在使用与引用类型结果相同的方法处理纯右值的 cv 限定(参见 5/5)。
这种变化的原因可能是什么? C++11 及之前被拒绝的非类纯右值拥有任何 cv 资格的权利。 C++14 表示非类、非数组纯右值可以具有 cv 限定,但这些 cv 限定在在任何进一步分析之前被丢弃。
我的猜测是,有一些新的(针对 C++14 的)语言特性可以在适当的情况下(在上述调整发生之前)以某种方式“看到”纯右值的 cv 限定。它们存在吗?如果有,这些功能是什么?2
问题源于以下上下文:想象一个编译器在内部将类 X
的隐藏参数 this
实现为 X *const
类型的变量>。由于编译器需要将 this
公开为纯右值,因此 const
不应在 C++11(或之前)中导致任何问题,其中标量纯右值永远不会是 cv -合格的。但是 C++14 呢?如果同一个编译器将 this
暴露为 X *const
类型的纯右值,它可能会导致问题吗?
1 C++14 中的 5/6 和 3.10/4 中的注解似乎有矛盾,但注解无论如何都不是规范的。我正在使用文本的草稿版本。
2 我最初的猜测是decltype
。而且我什至以为我在尝试的时候找到了答案
std::cout << std::is_same<decltype((const int) 0), const int>::value << std::endl;
在 GCC 中,输出 1
。但是,看到 Clang 和 VC++ 输出 0
(并且 decltype
的规范似乎不支持这种行为)我倾向于认为这只是一个错误在 GCC 中(从 6.1 开始)
最佳答案
根据commit on github , 这样做是为了解决 CWG1261: Explicit handling of cv-qualification with non-class prvalues
根据对该问题的评论,this
(正式为 prvalue)和 gcc formerly 的类型类别似乎存在令人惊讶的变化空间。而 MSVC 目前改为使用 const lvalue。
措辞收紧漏洞以明确表示,例如,即使 this
是通过某种编译器内部的魔法,也是 X* const
类型的纯右值,在进行任何进一步分析之前将其调整为 X*
。
同样,您给出的示例确实看起来像 gcc 错误。可能 decltype
在应用 c 样式转换之前没有查看值类型。
它现在是 [basic.lval]/4 中的注释的原因是它现在是 [expr]/6 中的新文本的结果,而不是在 [basic.lval]/4 中指定规则。
完全归功于 T.C.在对问题的评论中基本上回答了这个问题,包括对 gcc 错误修复的引用,以及以前未充分指定 cv-qualified non-class non-array prvalues 行为的各种其他示例 .
关于c++ - C++14 中纯右值的 Cv 限定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42989034/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!