Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二阶隐式转换_C++_Language Lawyer_C++14_Implicit Conversion_Conversion Operator - Fatal编程技术网

C++ 二阶隐式转换

C++ 二阶隐式转换,c++,language-lawyer,c++14,implicit-conversion,conversion-operator,C++,Language Lawyer,C++14,Implicit Conversion,Conversion Operator,考虑以下代码: #include <iostream> class first { public: constexpr first(bool val) noexcept : _value{val} {} constexpr operator bool() const noexcept {return _value;} private: bool _value; }; class second { public

考虑以下代码:

#include <iostream>

class first
{
    public:
        constexpr first(bool val) noexcept : _value{val} {}
        constexpr operator bool() const noexcept {return _value;}
    private:
        bool _value;
};

class second
{
    public:
        constexpr second(first val) noexcept : _value{val} {}
        constexpr operator first() const noexcept {return _value;}
    private:
        first _value;
};

int main(int argc, char** argv)
{
    first f{false};
    second s{true};
    bool b1 = f;
    bool b2 = s; // Not compiling 
    return 0;
}
#包括
头等舱
{
公众:
constexpr first(bool val)noexcept:_value{val}{}
constexpr运算符bool()const noexcept{return_value;}
私人:
布尔值;
};
二等
{
公众:
constexpr second(first val)noexcept:_value{val}{}
constexpr运算符first()const noexcept{return_value;}
私人:
第一_值;
};
int main(int argc,字符**argv)
{
第一个f{false};
第二个s{true};
bool b1=f;
bool b2=s;//未编译
返回0;
}
直到最近,我一直认为标准和编译器“足够聪明”,可以在存在时找到所需的转换序列

换句话说,我认为
boolb2=s
首先将
s
转换为
,然后再转换为
bool
。但显然,这并没有发生


对于
第一次
第二次
获得等效行为的正确方法是什么?

您需要在
第二次
中添加
操作符bool
。编译器将只查看一个用户定义的隐式转换。

您需要向
秒添加
运算符bool
。编译器将只查看一个用户定义的隐式转换。

这是不可能的,因为只允许一个用户定义的转换:

4次标准转换[conv]

7[注:对于类类型,用户定义的转换被视为 好的,请参见12.3。通常,隐式转换序列(13.3.3.1) 由标准转换序列和用户定义的 转换之后是另一个标准转换序列。-结束 注]

以及

12.3转换[class.conv]

4最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个 价值观

参见项目5(注意用户定义的转换函数)、28(智能指针)和30(代理类)更有效的C++。


对于标准转换(使用内置类型),序列中可以有多少转换没有限制。

这是不可能的,因为只允许单个用户定义的转换:

4次标准转换[conv]

7[注:对于类类型,用户定义的转换被视为 好的,请参见12.3。通常,隐式转换序列(13.3.3.1) 由标准转换序列和用户定义的 转换之后是另一个标准转换序列。-结束 注]

以及

12.3转换[class.conv]

4最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个 价值观

参见项目5(注意用户定义的转换函数)、28(智能指针)和30(代理类)更有效的C++。


对于标准转换(使用内置类型),对序列中可以有多少转换没有限制。

我似乎记得旧的
std::auto_ptr
的标准化实现以某种方式绕过了这一限制。有点像。不,
std:auto_ptr
没有到原始指针的隐式转换。为了将所有权从初始值设定项转移到声明的变量,它只是经历了一个明显的双重转换。它有一个模板化的到
auto\u ptr\u ref
的隐式转换,加上一个构造函数,提供从
auto\u ptr\u ref
的隐式转换。这个序列看起来确实像是双重转换。不,我没有想到双重转换序列,我也没有想到
操作符->
。作为对你第一次困惑的回应,我查了一下,然后公布了细节,你现在对此做出了回应。你知道,你可以在回答之前先读一遍。我认为你应该自己做。我考虑到了星期天的影响和所有。TemplateRex:在我50岁以上的时候,我仍然不知道如何与那些没有得到最简单东西的人讨论事情。他们固执地坚持自己的胡说八道,不管有多少次的反驳。所以,我要离开这里。你本可以学到一些东西的。你没有。我似乎记得旧的
std::auto_ptr
的标准化实现在某种程度上绕过了这个限制。有点像。不,
std:auto_ptr
没有到原始指针的隐式转换。为了将所有权从初始值设定项转移到声明的变量,它只是经历了一个明显的双重转换。它有一个模板化的到
auto\u ptr\u ref
的隐式转换,加上一个构造函数,提供从
auto\u ptr\u ref
的隐式转换。这个序列看起来确实像是双重转换。不,我没有想到双重转换序列,我也没有想到
操作符->
。作为对你第一次困惑的回应,我查了一下,然后公布了细节,你现在对此做出了回应。你知道,你可以在回答之前先读一遍。我认为你应该自己做。我考虑到了星期天的影响和所有。TemplateRex:在我50岁以上的时候,我仍然不知道如何与那些没有得到最简单东西的人讨论事情。他们固执地坚持自己的胡说八道,不管有多少次的反驳。所以,我要离开这里。你本可以学到一些东西的。您没有。我知道您正在为位迭代器编写提案,请参阅此类代理类的限制。我知道您正在为位迭代器编写提案,请参阅此类代理类的限制。