C++ C++;使用bool的变量转换构造函数

C++ C++;使用bool的变量转换构造函数,c++,c++17,c++20,C++,C++17,C++20,在(4)中,转换构造函数描述如下: 转换构造函数。构造一个变量,该变量包含可选类型T_j,如果同时范围内的每个T_i类型中存在虚函数F(T_i)的重载,则该变量将通过重载解析为表达式F(std::forward(T))选择,但以下情况除外: 只有当声明tix[]={std::forward(T)}时,才考虑重载F(tii)对某些虚构变量x有效 如果T_i是(可能符合cv条件的)bool,F(T_i)只有在std:remove\u cvref\u T也是bool时才会考虑 我特别感兴趣的是关于

在(4)中,转换构造函数描述如下:

转换构造函数。构造一个变量,该变量包含可选类型
T_j
,如果同时范围内的每个
T_i
类型中存在虚函数
F(T_i)
的重载,则该变量将通过重载解析为表达式
F(std::forward(T))
选择,但以下情况除外:

  • 只有当声明
    tix[]={std::forward(T)}时,才考虑重载
    F(tii)
    对某些虚构变量
    x
    有效
  • 如果
    T_i
    是(可能符合cv条件的)
    bool
    F(T_i)
    只有在
    std:remove\u cvref\u T
    也是
    bool
    时才会考虑
我特别感兴趣的是关于
bool
的第二个要点。在这个例子中,它说:

std::变体y(“abc”);//好,选择字符串;布尔不是候选人

我现在已经用clang7.0.0()、gcc.8.2()和VS2017测试了相同的代码。我想知道为什么包含的替代类型是bool(对于所有三个编译器),而不是cppreference所描述的std::string。这是三个编译器的标准库中的一个bug吗

我还发现了以下文档:。这是否意味着,CPP参考列表的修改(两个要点)仅被提出,但尚未成为官方标准的一部分?

已在圣地亚哥采用。它的措辞适用于工作草案——你可以在中看到新的措辞

作为这一变化的一部分,激励性示例:

variant<string, bool> x = "abc";
variant x=“abc”;
现在保存的是
字符串(在c++20中),而过去保存的是
bool
(在c++17中)。此示例的含义在标准版本之间发生变化


只是还没有一个标准库实现了这一更改。这是最近的事。在和页面中都列为不完整。但正如您所看到的,还有大量的C++20特性尚未实现。好消息是,现在还是2019年初,还有很多时间 C++实现的目标是有用,因此它们不会死死地遵守已发布的标准文本。没有理由维护与一张纸的bug-for-bug兼容性

(作为一个极端的例子,在C++17之前,标准在技术上要求将
std::vector v;
中的
解析为头名,然后拒绝,因为它不在
#include
指令中。不用说,没有编译器会这样做。)

CPPPreference也希望有用。因此,我们也不维护与标准的bug-for-bug兼容性。当一段文字第一次出现在ISO出版的一篇论文中时,它是无用的(也许标准历史学家除外);作为程序员,我们关心的是当我们使用
-std=c++17
,或者无论您的实现的等效标志是什么,我们都会得到什么。因此,我们的文档是假设每个C++标准的完整和正确的实现,加上所有适用于该标准的后续错误和澄清。*我们使用当前的实现作为这种假设实现的证据。 当一个特定的变更没有当前的实现时,我们评估变更的性质,以预测实现将如何处理它。旨在追溯的核心语言更改被标记为缺陷报告,这使得调用更容易(尽管有时它们不会一直返回,这不在标记中)。然而,库的更改并没有一致地应用“DR”标签,因此这一要求更取决于我们

在这种特殊情况下,虽然P0608没有标记为缺陷报告,但它在发布后不久就纠正了C++17中一个极为可疑的行为。此外,像
std::variant x=“abcd”这样的代码是非常不可取的
根据标准模式在同一实现上以静默方式更改含义。依赖于std::variant的代码在野外也很少见(这就是委员会最初批准“突破性”更改的部分原因)。因此,我预测这篇论文最终将被追溯应用,并相应地记录下来



*这是几年前哲学上的一个变化;因此,我们仍然有很多错误修复在文档中不被视为具有追溯力,但应该被视为具有追溯力的情况。随着时间的推移,它们正在慢慢地被清理。

据我所知,cppreference已经开始更新页面,但编译器还没有跟上。我将把它留给确实能够回答问题的人。看起来像是这个页面。这是否像cppreference页面上所说的那样追溯到了C++17?@NathanOliver非常肯定不是。它不是一个库问题,而是一个新的库功能。所以我认为这对于C++20.Hmm来说是新的。如果是这样的话,我需要问他们是否可以修复页面。@NathanOliver或我们中的一个人可以修复:-)我期望(并且仍然期望)这篇论文能够追溯实施。