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岁以上的时候,我仍然不知道如何与那些没有得到最简单东西的人讨论事情。他们固执地坚持自己的胡说八道,不管有多少次的反驳。所以,我要离开这里。你本可以学到一些东西的。您没有。我知道您正在为位迭代器编写提案,请参阅此类代理类的限制。我知道您正在为位迭代器编写提案,请参阅此类代理类的限制。