- 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/
在 Haskell 中,我可以导入由其名称或快捷方式名称限定的模块,如下所示: import qualified Data.List as List import qualified Data.Map
我在头文件中有以下函数声明: extern void flash(const char *message, const enum msg_type type); 基本上,它有两个参数并将相应的消息推送
我遇到了一个我似乎无法理解的小问题。 我正在我的数据库中搜索一个用户一个月内收到的评论总数,然后绘制成图表。 我遇到的问题是在我的 SQL 语句中使用 MONTHNAME 如果我使用 $this->d
根据 this answer , 常量不应该被删除,因为它们可能一开始就没有分配。但是,在某些情况下我想保护动态分配的数据。例如,在管理用户 session 时†,我想确保像当前用户名这样的数据不会被
我正在处理一个大型 C++ 项目。我有一堆在项目的子集中使用的宏,但我不想将它们导出到任何地方,以避免污染不相关的代码。 现在,我的许多文件看起来像 #include // defines MACR
谁能解释为什么代码无法编译。 template struct Base { T a; Base(const T argB) : a(argB){} }; template struct Der
我正在阅读 C++-Primer(作者:Josée Lajoie 和 Stanley B. Lippman),这时我看到了有关顶级和低级 const 的部分。在一段中,它说当复制对象时,顶级 cons
我有一大块 CSS,我想将其“作用域”到特定的 HTML block 。我正在生成一个唯一的 ID,然后将其设置在 HTML block 上,然后想用相同的 ID 包装 CSS block ,以便这些
我正在尝试为接受三个参数的函数创建一个通用接口(interface)。填写第一个参数时,第二个参数的选项应该在第一个参数的范围内。第三个参数应该在第二个参数的范围内。 我当前的代码如下所示: type
似乎 C++11 和 C++14 对待纯右值的 cv 限定不同。 C++11 坚持自 C++98 以来一直存在的“经典”方法:根据 3.10/4 “非类纯右值始终具有 cv 非限定类型”。 C++14
这个问题在这里已经有了答案: Stripping all qualifiers from a function type (1 个回答) 关闭去年。 我想编写一个模板,它接受一个指向成员函数的指针(
有时在引用同一类(或基类)的其他实例成员的实例成员中阅读代码可能会造成混淆: public void MyMethod() { Where = did + AllTheseWeirdThing
因此,在使用 constexpr 时,MSVC (Visual Studio 2012) 在尝试使用这个简单的程序(包括省略)使用 constexpr 关键字限定我的函数时给了我一个错误: const
这是我的 html(在 Twig 模板中) {{folder.name}} 我正在尝试从“data-jstree”获取“type”的值。 我试过用 var node_id = ref.get_node
当我尝试编译以下函数时出现错误。 string& foo(){ return "Hello World"; } Error: 1 IntelliSense: a reference of type
我有以下情况: 一个函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数不应修改外部指针指向的指针或字符串本身,因此我将它们设为常量。 最小的例子: void function(const
我希望能够限定 XHTML 文档中的 KnockOutJS 属性。 这是我想做的: My name is:
我正在浏览 Programming with Objective-C Apple 提供的文档。 我正在尝试理解以下段落,但到目前为止,无法理解。 @protocol XYZPieChartViewDa
给定两个 cv-unqualified 非数组对象类型 T1和 T2 , 可以表达 true ? std::declval() : std::declval()曾经有过 cv 限定的数组或函数类型吗?
我是一名优秀的程序员,十分优秀!