1

このコード:

class foo
{
    int x;
public:
    foo(int x) : x(x) { }
    int get() const { return x; }
    //...
};

class bar
{
    int x;
public:
    bar(const foo& x) : x(x.get()) { }
    int get() const { return x; }
    bar& operator =(const foo& rhs) { x = rhs.get(); return *this; }
    //...
};

void func()
{
    foo f = 3;
    bar b = 3;
    b = 7;
    //...
}

行のエラーbar b = 3(g ++ 4.7.1 with -fstd=gnu++11):

error: conversion from 'int' to non-scalar type 'bar' requested

ただし、を受け取るbarコンストラクターを提供していfooます。intは、その前の行に示されているように暗黙的に変換できますfoo。では、何が問題になっていますか?

ちなみに、いくつかの理由から、変換を強制的にfoo使用することは望ましくfoo(3)ありません。これは、実際のコードを使用して読み取るのが醜くなるためです。

4

2 に答える 2

5

fooを受け取るbarコンストラクターを提供していますが、その前の行に示されているように、intを暗黙的にfooに変換できます。では、何が問題になっていますか?

連鎖変換はC++では許可されていません。つまり、(連鎖)変換は発生しません。

int -> foo -> bar  //not allowed (chained conversion)

以下が与えられているとしても:

int -> foo  //given
foo -> bar  //given

したがって、作業したい場合は、クラスint -> barを取得する別のコンストラクターを追加します。intbar

于 2013-02-16T21:24:58.203 に答える
0

§13.3.3.1.2/1暗黙のユーザー定義の変換シーケンスの義務について:

ユーザー定義の変換シーケンスは、最初の標準変換シーケンス、ユーザー定義の変換(12.3)、2番目の標準変換シーケンスで構成されます。ユーザー定義の変換がコンストラクター(12.3.1)によって指定されている場合、最初の標準変換シーケンスは、ソースタイプをコンストラクターの引数に必要なタイプに変換します。ユーザー定義の変換が変換関数(12.3.2)によって指定されている場合、最初の標準変換シーケンスは、ソースタイプを変換関数の暗黙的なオブジェクトパラメーターに変換します。

これは、複数のユーザー定義の変換を連鎖させることができないことを意味します。

于 2013-02-16T21:34:40.217 に答える