1

考虑以下代码:

#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;
}

直到最近,我还认为标准和编译器足够“聪明”,可以在需要的转换序列存在时找到它。

换句话说,我在想它bool b2 = s会转换sfirst,然后转换为bool。但显然它没有发生。

获得 和 的等效行为的正确方法是first什么second

4

2 回答 2

3

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

4 标准转换 [conv]

7 [注:对于类类型,也考虑用户定义的转换;见 12.3。通常,隐式转换序列 (13.3.3.1) 由一个标准转换序列和一个用户定义的转换序列和另一个标准转换序列组成。——尾注]

12.3 转换 [class.conv]

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

另请参阅更有效的 C++ 的第 5 项(警惕用户定义的转换函数)、28 项(智能指针)和 30 项(代理类)。

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

于 2016-01-17T12:22:12.317 回答
1

您需要添加一个operator boolto second。编译器只会查看一个用户定义的隐式转换。

于 2016-01-17T04:16:37.750 回答