- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
用 C++17 标记,因为这是我引用的规范版本。
这是 IMO,标准的相关部分,第 23.15.7.6 节 [meta.trans.other]。
template <class... T> struct common_type;
Unless this trait is specialized (as specified in Note B, below), the member type shall be defined or omitted as specified in Note A, below. If it is omitted, there shall be no member type. Each type in the parameter pack T shall be complete, cv void, or an array of unknown bound.
附注A...
3. Note A: For the common_type trait applied to a parameter pack T of types, the member type shall be either defined or not present as follows:
(3.1) — If
sizeof...(T)
is zero, there shall be no member type.(3.2) — If
sizeof...(T)
is one, let T0 denote the sole type constituting the pack T. The member typedef-name type shall denote the same type, if any, ascommon_type_t<T0, T0>;
otherwise there shall be no member type.(3.3) — If
sizeof...(T)
is two, let the first and second types constituting T be denoted by T1 and T2, respectively, and let D1 and D2 denote the same types asdecay_t<T1>
anddecay_t<T2>
, respectively.(3.3.1) — If
is_same_v<T1, D1>
isfalse
oris_same_v<T2, D2>
isfalse
, let C denote the same type, if any, ascommon_type_t<D1, D2>
.(3.3.2) — Otherwise, let C denote the same type, if any, as
decay_t<decltype(false ? declval<D1>() : declval<D2>())>
[ Note: This will not apply if there is a specializationcommon_type<D1, D2
>. — end note ]In either case, the member typedef-name type shall denote the same type, if any, as C. Otherwise, there shall be no member type.
(3.4) — If
sizeof...(T)
is greater than two, let T1, T2, and R, respectively, denote the first, second, and (pack of) remaining types constituting T. Let C denote the same type, if any, ascommon_type_t<T1, T2>
. If there is such a type C, the member typedef-name type shall denote the same type, if any, ascommon_type_t<C, R...>
. Otherwise, there shall be no member type.
和注释 B...
4. Note B: Notwithstanding the provisions of 23.15.2, and pursuant to 20.5.4.2.1, a program may specialize
common_type<T1, T2>
for types T1 and T2 such thatis_same_v<T1, decay_t<T1>>
andis_same_v<T2, decay_t<T2>>
are each true. [Note: Such specializations are needed when only explicit conversions are desired between the template arguments. — end note ]Such a specialization need not have a member named type, but if it does, that member shall be a typedef-name for an accessible and unambiguous cv-unqualified non-reference type C to which each of the types T1 and T2 is explicitly convertible. Moreover,
common_type_t<T1, T2>
shall denote the same type, if any, as doescommon_type_t<T2, T1>
. No diagnostic is required for a violation of this Note’s rules.
基于此,我希望以下断言能够通过(它们会通过)...
static_assert(not std::is_const_v<std::common_type_t<const volatile int, short>>);
static_assert(not std::is_volatile_v<std::common_type_t<const volatile int, short>>);
static_assert(std::is_same_v<std::common_type_t<int, short>, std::common_type_t<short, const volatile int>>);
static_assert(std::is_same_v<std::common_type_t<int &, short>, std::common_type_t<int, short>>);
同样,我希望这些也能通过...
using D1 = std::chrono::duration<int, std::ratio<2, 20>>;
using D2 = std::chrono::duration<short, std::ratio<7, 100>>;
static_assert(not std::is_const_v<std::common_type_t<const D1, D2>>);
static_assert(not std::is_volatile_v<std::common_type_t<volatile D1, D2>>);
static_assert(std::is_same_v<std::common_type_t<D1, D2>, std::common_type_t<const D1, D2>>);
static_assert(std::is_same_v<std::common_type_t<D1 &, D2>, std::common_type_t<D1, D2>>);
但是,我在调用 std::common_type
时遇到编译器错误将任何简历限定符或引用添加到 std::chrono::duration
.
对我来说,标准似乎表明第二组断言应该成功,但它们在 clang 和 gcc 中都失败了。因此,我假设我误读了标准 - 或者两家供应商都有相同的错误,这在某种程度上不太可能(另外,在打赌谁错了时,我总是和我一起去)。
也许“除非这个特性是特化的(如下文注释 B 中指定的)”这句话意味着注释 A 第 3.3 节的租户都没有申请特化,但这意味着我们可以合法地得到非常奇怪的结果...就像要求这个时的编译错误...
using D1 = std::chrono::duration<int, std::ratio<2, 20>>;
using D2 = std::chrono::duration<short, std::ratio<7, 100>>;
static_assert(not std::is_const_v<std::common_type_t<const D1, D2>>);
正常使用std::common_type
不需要在调用它之前删除 cv 限定符和引用 - 但特化似乎要求调用者必须删除 cv 限定符和引用。
这似乎是错误的……某处。所以,我想弄清楚...规范、供应商实现或我的头脑是否有误?
更新
编译器资源管理器中的 gcc/trunk 似乎成功编译了我认为应该编译的所有内容,尽管 gcc 9.2 以及所有 clang 版本都失败了。
最佳答案
关于c++ - std::common_type 的特化 - 误解、错误、两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58330207/
所以我实际上正在阅读有关用于删除对象属性的“delete”方法的文档,并且我偶然发现了这个“此外,您不能删除使用 var 关键字声明的全局对象的属性。” 所以我真正理解的是:假设你创建了一个数组: v
我目前正在学习 Javascript,我想知道为什么下面的代码会执行“console.log('why')”。我认为“变量”(var、let、const)仅存储信息,不能自行执行。我不希望以下内容实际
在许多博客和引用文献中,我读到了有关冲洗刷新记录的信息,其中有很多信息会引起头痛和一些误解: 是否为复制的碎片保留了事务日志?为什么? 如果GET /_cat/allocation包含转记录? 超过磁
我有下一个循环: rolling_average_delta_follower=[]; followers=[32,34,36,38,40,42,44,46,48,50,52,54,5
我遇到了多处理问题;我在 linux 2.6.36 上使用 python2.7。我知道使用更高级别的模块或库会容易得多,但我正在尝试使用较低级别的函数(os.fork() 和 os.exec*)以确保
有人可以向我解释一下,为什么这段代码不起作用。我正在浏览周围的一些问题,但找不到答案。可能是因为(大量)缺乏知识。 感谢您提供的任何帮助。 char** sentence = malloc(min);
我的目标是我想用一些 java 代码登录到一个站点,并在登录后做一些工作。(为了编写一些 java cooking 处理,我首先需要了解这一切实际上是如何工作的)问题是我不太清楚如何管理 cookie
给定以下非常简单的结构: struct A { int a; double b; }; (使用 Mac OS 10.9 - Xcode) 结构的大小是 16。我不明白为什么。为什么不是
我刚刚下载了基于 ASP.NET 5 的 music store (microsoft sample projct) 源代码。我不明白为什么 Microsoft 的开发人员在 Controller 中
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
我正在阅读 this doc并看到以下片段: The := syntax is shorthand for declaring and initializing a variable, e.g. fo
我在理解描述的 MixColumns 步骤时遇到问题 here . 我知道扩散,这一切都是有道理的,因为它指出每列都被视为多项式并乘以 GF(2^8) 的模。 但是..乘以GF(2 ^ 8)。尽管域仍
我尝试自定义HTML文件输入并编写了最简单的jquery API函数: (function($) { $.fn.selectFileInputGUI = function() {
我对 SSL/TLS 有一个根本性的误解,希望能得到澄清。 按照我的理解,当我获得网站证书时,它包含我的所有信息,并由我的证书颁发机构(VeriSign 或其他任何人)签名。当有人从我的网站请求使用
我们在代码中有一个 NamedTuple,如下所示: from typing import NamedTuple class StandardParameters(NamedTuple): o
我有一个问题,我需要你的帮助: 我正在制作一个 Web 应用程序来访问我需要在类似( ListView 或 DataList )这样的工具中显示他们的员工列表,以直接绑定(bind)数据库中的数据,并
我知道根是: 静态字段 方法参数 本地领域 f-queue 也包含一个指向“将要完成的”对象的指针 cpu 寄存器 <=??? 现在让我们谈谈寄存器。 它们可以包含的代码如下: mov bx, 003
官方例子Timer组件使用this.interval var Timer = React.createClass({ getInitialState: function() { retur
使用 PostGIS 我有两个表,第一个包含 250 个城市的边界,第二个包含世界上所有国家/地区的边界。 我试图影响每个城市所属的国家/地区。下面的查询可以让我得到我想要的结果。 SELECT DI
我正在准备数据库和 SQL 考试,并且正在解决一个练习: 我们有一个包含 4 个表的数据库,代表一家人力资源公司。这些表格是: applicant(a-id,a-name,a-city,years-
我是一名优秀的程序员,十分优秀!