c++ - C++14 中纯右值的 Cv 限定

标签 c++ c++11 c++14 language-lawyer

似乎 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/

相关文章:

c++ - Lua C API : Handling and storing additional arguments

c++ - 数据驱动测试不好吗?

c++ - 是否可以定义一个 C++11 可变参数类模板,其可变参数基数取决于整数模板参数?

c++ - C++ 11 中的 sleep 排序

c++ - 下面粗体的句子,在 Nicolai Josuttis 的书 "The Standard Library"中,我不清楚

c++ - cv-qualified struct 的成员不是类似的 cv-qualified

c++ - 不复制就返回std::function

c++ - 在 cmpxchg16b 的汇编代码中编译时出错

c++ - 是否有返回字符的 ASCII 值的函数? (C++)

c++ - 静态 constexpr 成员变量初始化