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変換sされると考えていました。しかし、明らかにそれは起こっていません。firstbool

と の同等の動作を取得するための正しいアプローチは何firstですかsecond?

4

2 に答える 2

3

ユーザー定義の変換は 1 つしか許可されていないため、これは不可能です。

4 標準コンバージョン [conv]

7 [ 注: クラス型の場合、ユーザー定義の変換も考慮されます。12.3を参照してください。一般に、暗黙的な変換シーケンス (13.3.3.1) は、標準の変換シーケンスとそれに続くユーザー定義の変換、さらに別の標準の変換シーケンスで構成されます。— エンドノート]

としても

12.3 変換 [class.conv]

4 最大 1 つのユーザー定義の変換 (コンストラクターまたは変換関数) が暗黙的に単一の値に適用されます。

More Effects C++ の項目 5 (ユーザー定義の変換関数に注意)、項目 28 (スマート ポインター)、項目 30 (プロキシ クラス) も参照してください。

標準の変換 (組み込み型を使用) の場合、シーケンス内で可能な変換の数に制限はありません。

于 2016-01-17T12:22:12.317 に答える